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。
首先将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");
}
}
}
}