繁体   English   中英

如何在MVVM中绑定DataGrid的SelectedItems属性?

[英]How can I binding the SelectedItems property of a DataGrid in MVVM?

好吧,我正在使用MVVM Light,并且尝试了该解决方案在事件selectionChanged中将datagrid的selectedItems作为参数传递。 这样我就可以获取selecteditems,并可以在视图模型中更新变量。

乍一看,这是一个很好的解决方案。 问题是,如果我在视图模型中将SelectedIndex属性设置为-1以取消全选,或者将SelectedItem属性设置为null,则不会触发事件selectionChanged。 我想这真的很好,因为为什么视图会向视图模型通知在视图模型的第一时间更改的属性的更改? 这不会产生周期,但是随后我需要手动清除视图模型中的SelectedItems属性并进行通知,并将事件OnSelectionChanged引发到另一个视图模型中代码许多部分的更改。

我想知道当我在视图模型中更改属性时如何强制引发selectionChagend事件。 解决方案可能是附加属性,而不是使用事件selectionChanged。

我有哪些选择?

谢谢。

在所选项目的设置器中使用RaisePropertyChanged。

private T _selectedItem;
public T SelectedItem
{
    get
    {
        return _selectedItem;
    }
    set
    {
        if(value != _selectedItem)
        {
            _selectedItem = value;
            RaisePropertyChanged("SelectedItem");
        }
    }
}

或看看这个: INotifyPropertyChanged已过时,而这个: 没有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用于隐式传递调用成员的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM