Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在内容更新时自动调整Listview列的大小_C#_Wpf_Listview_Mvvm - Fatal编程技术网

C# 在内容更新时自动调整Listview列的大小

C# 在内容更新时自动调整Listview列的大小,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,我试图让listview中的gridviewcolumns在绑定源更新时自动调整内容大小(viewmodel上的observablecollection) 当我刷新/更新集合时,listview填充良好,但不工作。这就是我目前正在尝试的解决方案: XAML: 据我所知,SourceUpdate事件从不触发。我不知道这是否是因为datacontext设置为ViewModel?不确定如何从VM与ListView交互 是否有更好的方法尝试使用ViewModel执行此操作?仍然是新的,正在尝试学习MVV

我试图让listview中的gridviewcolumns在绑定源更新时自动调整内容大小(viewmodel上的observablecollection)

当我刷新/更新集合时,listview填充良好,但不工作。这就是我目前正在尝试的解决方案:

XAML:

据我所知,SourceUpdate事件从不触发。我不知道这是否是因为datacontext设置为ViewModel?不确定如何从VM与ListView交互


是否有更好的方法尝试使用ViewModel执行此操作?仍然是新的,正在尝试学习MVVM。

SourceUpdate事件从未触发,因为您从未更改属性集合的值,或者属性集合未被通知。通过绑定在xaml中设置一次,但集合中内容的更改不会触发事件SourceUpdate


您可以正确使用一个ObservableCollection来实现接口INotifyCollectionChanged。因此,您可以在该集合上挂起事件CollectionChanged

以下是一个工作示例:

<Window x:Class="ListViewAutoResize.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <ListView x:Name="lv" Background="Beige" ItemsSource="{Binding items}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Column1" DisplayMemberBinding="{Binding}"/>
                <GridViewColumn Header="Column2" DisplayMemberBinding="{Binding}"/>
                <GridViewColumn Header="Column3" DisplayMemberBinding="{Binding}"/>
            </GridView>
        </ListView.View>
    </ListView>
    <Button Content="Add item" Click="btnAddItem_OnClick"/>
 </StackPanel>
</Window>

以下是代码隐藏:

public partial class MainWindow : Window
{
    public ObservableCollection<string> items { get; set; } 
    public MainWindow()
    {
        InitializeComponent();

        items = new ObservableCollection<string>();
        items.Add(("item1"));
        items.Add(("item2"));
        items.Add(("item3333"));
        items.Add(("item4"));
        items.Add(("item5"));
        items.CollectionChanged += items_CollectionChanged;
        this.DataContext = this;

    }

    void items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        var view = lv.View as GridView;
        AutoResizeGridViewColumns(view);
    }

    static void AutoResizeGridViewColumns(GridView view)
    {
        if (view == null || view.Columns.Count < 1) return;
        // Simulates column auto sizing
        foreach (var column in view.Columns)
        {
            // Forcing change
            if (double.IsNaN(column.Width))
                column.Width = 1;
            column.Width = double.NaN;
        }
    }

    private void btnAddItem_OnClick(object sender, RoutedEventArgs e)
    {
        items.Add("aaaaaaaaaabbbbbbb");
    }
}
公共部分类主窗口:窗口
{
公共ObservableCollection项{get;set;}
公共主窗口()
{
初始化组件();
items=新的ObservableCollection();
项目。添加((“项目1”);
项目。添加((“项目2”);
项目。添加((“项目3333”);
项目。添加((“项目4”);
项目。添加((“项目5”);
items.CollectionChanged+=items\u CollectionChanged;
this.DataContext=this;
}
无效项\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var view=lv.view作为GridView;
AutoResizeGridViewColumns(视图);
}
静态void AutoResizeGridViewColumns(GridView视图)
{
if(view==null | | view.Columns.Count<1)返回;
//模拟列自动调整大小
foreach(view.Columns中的var列)
{
//强迫改变
if(double.IsNaN(列宽))
列宽=1;
列宽=double.NaN;
}
}
私有void btnAddItem_OnClick(对象发送方,路由目标)
{
项目。添加(“AAAAAAAAABBBBB”);
}
}
就这样

之前:

之后:


对不起-我想我是想暗示一下,但如果需要,我可以包含代码。我在作为上述视图的DataContext的ViewModel上有一个ObservableCollection(集合)。我还有一个按钮绑定到一个命令,该命令使用新数据重新填充ObservableCollection(collection),新数据会毫无疑问地反映在ListView中。如果我应该包括这段代码,请让我知道,但我不认为它是相关的,因为它是标准的,工作没有问题。
<Window x:Class="ListViewAutoResize.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <ListView x:Name="lv" Background="Beige" ItemsSource="{Binding items}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Column1" DisplayMemberBinding="{Binding}"/>
                <GridViewColumn Header="Column2" DisplayMemberBinding="{Binding}"/>
                <GridViewColumn Header="Column3" DisplayMemberBinding="{Binding}"/>
            </GridView>
        </ListView.View>
    </ListView>
    <Button Content="Add item" Click="btnAddItem_OnClick"/>
 </StackPanel>
</Window>
public partial class MainWindow : Window
{
    public ObservableCollection<string> items { get; set; } 
    public MainWindow()
    {
        InitializeComponent();

        items = new ObservableCollection<string>();
        items.Add(("item1"));
        items.Add(("item2"));
        items.Add(("item3333"));
        items.Add(("item4"));
        items.Add(("item5"));
        items.CollectionChanged += items_CollectionChanged;
        this.DataContext = this;

    }

    void items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        var view = lv.View as GridView;
        AutoResizeGridViewColumns(view);
    }

    static void AutoResizeGridViewColumns(GridView view)
    {
        if (view == null || view.Columns.Count < 1) return;
        // Simulates column auto sizing
        foreach (var column in view.Columns)
        {
            // Forcing change
            if (double.IsNaN(column.Width))
                column.Width = 1;
            column.Width = double.NaN;
        }
    }

    private void btnAddItem_OnClick(object sender, RoutedEventArgs e)
    {
        items.Add("aaaaaaaaaabbbbbbb");
    }
}