WPF XAML DataGrid 和 SelectAll

Posted

技术标签:

【中文标题】WPF XAML DataGrid 和 SelectAll【英文标题】:WPF XAML DataGrid and SelectAll 【发布时间】:2020-11-28 02:46:01 【问题描述】:

我有一个绑定到一个简单对象列表的 DataGrid 和一个 Checkbox,我想设置/取消设置列表中这些对象的 Selected 字段。

下面的代码不起作用。单击全选复选框会更改数据,但不会更新网格。 但是,如果我改变了

get => this._ordersToTransmit; 

get => this._ordersToTransmit.ToList(); 

然后网格会更新并且可以正常工作。

谁能向我解释为什么我需要把ToList() 放在那里?也许我应该做一些完全不同的事情?

class ViewModel

     private List<OrderListItem> _ordersToTransmit;

     public List<OrderListItem> OrdersToTransmit 
      
          get => this._ordersToTransmit; 
          set => this.SetProperty(ref this._ordersToTransmit, value); 
     

    public bool SelectAll
    
        get => this._selectAll;
        set
        
            this.SetProperty(ref this._selectAll, value);

            foreach (OrderListItem item in this._ordersToTransmit)
                item.Selected = value;

            this.RaisePropertyChanged(nameof(TransmitOrdersViewModel.OrdersToTransmit));
        
    

<CheckBox Content="Select All" IsChecked="Binding SelectAll, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged" />

<DataGrid ItemsSource="Binding OrdersToTransmit"  AutoGenerateColumns="False">
     <DataGrid.Columns>
          <DataGridCheckBoxColumn Binding="Binding Selected" />
     </DataGrid.Columns>
</DataGrid>

【问题讨论】:

你在哪里设置OrdersToTransmit属性?您是要仅更新现有项目的 Selected 列/属性,还是要尝试做什么? 在构造函数中。这是一个项目的 DataGrid,在 DataGrid 上方有一个复选框,当它被选中时,所有项目都应该检查它们的 Selected 属性 【参考方案1】:

您为列表提出 NotifyPropertyChanged,但列表实际上并没有改变:列表中的项目正在改变。

你可以:

为列表中的每个项目提高 NotifyPropertyChanged。 替换整个列表,这是你调用时所做的 ToList():动态创建一个新的列表对象。 强制刷新您的 DataGrid:请参阅 How to refresh datagrid in WPF

【讨论】:

在没有 ToList() 的情况下,单击全选后网格没有更新:如果我删除 ItemsSource="Binding OrdersToTransmit" 并重新输入,网格会清除,然后重新出现正确的数据(即全部选中) 这使我相信 RaisePropertyChanged 应该刷新此设置并显示更新的数据,就像我删除并重新输入 xaml 时一样。这是不正确的吗? 您正在调用 RaisePropertyChanged (OrdersToTransmit)。如果您设置 OrdersToTransmit = null 它是一个新的空对象并且网格变为空。如果您设置 OrdersToTransmit = new List() 它是一个新对象,并且网格显示列表包含的任何内容。如果你修改已经存在的列表,它是同一个对象并且什么都不会发生,直到你也提出一些事情来说明列表中的事情发生了变化。见 ObservableCollectiondocs.microsoft.com/en-us/dotnet/api/…

以上是关于WPF XAML DataGrid 和 SelectAll的主要内容,如果未能解决你的问题,请参考以下文章

WPF xaml:如何使用自动生成的列验证 DataGrid 中的单元格

XAML WPF DataGrid:在滚动时减小列宽度以适应其内容,除了一个

wpf 我已经把datagrid 分组了 如何 实现折叠 和 展开

WPF DataGrid 示例 应用源码

如何根据属性隐藏wpf datagrid列

在 WPF 中访问 DataGrid 的 ScrollView 属性