如何在 MVVM 中绑定 DataGrid 的 SelectedItems 属性?
How can I binding the SelectedItems property of a DataGrid in MVVM?
好吧,我正在使用 MVVM Light,并且我尝试了将事件 selectionChanged 中的数据网格的 selectedItems 作为参数传递的解决方案。这样我就可以获得所选项目,并且可以在视图模型中更新我的变量。
在第一时间,这是一个很好的解决方案。问题是,如果我在我的视图模型中将 SelectedIndex 属性 设置为 -1 以取消选择全部或将 SelectedItem 属性 设置为空,则不会触发事件 selectionChanged。我想这真的很好,因为为什么视图会通知视图模型 属性 在视图模型中第一时间发生变化的变化?这不会产生循环,但随后我需要手动清除我的视图模型中的 SelectedItems 属性,并通知我的事件 OnSelectionChanged 并将其提升到另一个视图模型,我的代码的许多部分发生了变化。
我想知道如何在更改视图模型中的 属性 时强制触发 selectionChagend 事件。也许解决方案可以是附加的 属性 而不是使用事件 selectionChanged.
我有哪些选择?
谢谢。
在所选项目的 setter 中使用 RaisePropertyChanged。
private T _selectedItem;
public T SelectedItem
{
get
{
return _selectedItem;
}
set
{
if(value != _selectedItem)
{
_selectedItem = value;
RaisePropertyChanged("SelectedItem");
}
}
}
或者看看这个:
INotifyPropertyChanged Is Obsolete
和这个:
Data Binding without INotifyPropertyChanged
编辑:
从 4.6 开始有更漂亮的方式:
private T _selectedItem;
public T SelectedItem
{
get
{
return _selectedItem;
}
set
{
if(value != _selectedItem)
{
_selectedItem = value;
OnPropertyChanged();
}
}
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> RaisePropertyChanged(propertyName);
CallerMemberName 用于隐式传递调用成员的名称。
好吧,我正在使用 MVVM Light,并且我尝试了将事件 selectionChanged 中的数据网格的 selectedItems 作为参数传递的解决方案。这样我就可以获得所选项目,并且可以在视图模型中更新我的变量。
在第一时间,这是一个很好的解决方案。问题是,如果我在我的视图模型中将 SelectedIndex 属性 设置为 -1 以取消选择全部或将 SelectedItem 属性 设置为空,则不会触发事件 selectionChanged。我想这真的很好,因为为什么视图会通知视图模型 属性 在视图模型中第一时间发生变化的变化?这不会产生循环,但随后我需要手动清除我的视图模型中的 SelectedItems 属性,并通知我的事件 OnSelectionChanged 并将其提升到另一个视图模型,我的代码的许多部分发生了变化。
我想知道如何在更改视图模型中的 属性 时强制触发 selectionChagend 事件。也许解决方案可以是附加的 属性 而不是使用事件 selectionChanged.
我有哪些选择?
谢谢。
在所选项目的 setter 中使用 RaisePropertyChanged。
private T _selectedItem;
public T SelectedItem
{
get
{
return _selectedItem;
}
set
{
if(value != _selectedItem)
{
_selectedItem = value;
RaisePropertyChanged("SelectedItem");
}
}
}
或者看看这个: INotifyPropertyChanged Is Obsolete 和这个: Data Binding without INotifyPropertyChanged
编辑: 从 4.6 开始有更漂亮的方式:
private T _selectedItem;
public T SelectedItem
{
get
{
return _selectedItem;
}
set
{
if(value != _selectedItem)
{
_selectedItem = value;
OnPropertyChanged();
}
}
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> RaisePropertyChanged(propertyName);
CallerMemberName 用于隐式传递调用成员的名称。