WPF DataGridCheckBoxColumn's状态不会从ViewModel更新

本文关键字:ViewModel 更新 状态 DataGridCheckBoxColumn WPF | 更新日期: 2023-09-27 18:12:01

我有一个DataGrid (ItemsSource是一个ObservableCollection)与DataGridCheckBoxColumn定义如下:

<DataGrid AutoGenerateColumns="False"  
          SelectionUnit="FullRow"
          CanUserAddRows="False"
          CanUserResizeColumns="False"
          CanUserResizeRows="False"
          IsReadOnly="True"
          SelectionMode="Single"
          ItemsSource="{Binding SearchResult, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}">
<!--additional columns-->
<DataGridCheckBoxColumn Header="Add"
                        IsReadOnly="False"
                        Binding="{Binding Path=IsSelected, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}">
</DataGrid>

绑定在一个方向上工作得很好,ViewModel可以看到集合中的变化,但在另一个方向上不起作用。当然,我可以在更新集合后重新初始化它,但这当然会打乱排序顺序。

List<int> Ids = new List<int>();
foreach (var result in SearchResult) // binding source, of type ObservableCollection
{
    if (result.IsSelected)
    {
        Ids.Add(result.Id);
        result.IsSelected = false; // should uncheck the corresponding DataGridCheckBoxColumn cell
    }
}
//SearchResult = new ObservableCollection<SearchSeries>(SearchResult); // does the job but rearranges the sorting
//RaisePropertyChanged("SearchResult"); // doesn't work either

我使用的是VS 2013和最新可用的MVVM Light Toolkit。

WPF DataGridCheckBoxColumn's状态不会从ViewModel更新

首先将DataGridCheckBoxColumn放入DataGrid.Columns中:

<DataGrid >
  <DataGrid.Columns>
    <DataGridCheckBoxColumn />
  </DataGrid.Columns>
</DataGrid>

第二SearchSeries应执行INotifyPropertyChanged

希望对你有所帮助

解决方案是像@Glen Thomas建议的那样在IsSelected的setter中调用RaisePropertyChanged()。我问这个问题已经有几天了,在此期间我没有做我的项目。它是ObservableCollection类型中唯一没有调用上述方法的成员,导致DataGrid无法"刷新"自己。
IsSelected属性实际上位于部分类中,它扩展了添加web服务引用(reference .cs文件)时生成的类。所有其他属性的设置调用RaisePropertyChanged()。

namespace Example.Client.ExampleService
{
    public partial class Search // the rest of the definition is in Reference.cs
    {
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set
            {
                _isSelected = value;
                RaisePropertyChanged("IsSelected");
            }
        }
    }
}