如何在 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 用于隐式传递调用成员的名称。