【问题标题】:WPF XAML DataGrid and SelectAllWPF XAML DataGrid 和 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 属性

标签: c# wpf xaml mvvm datagrid


【解决方案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/…
猜你喜欢
  • 2018-02-11
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多