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

时间:2016-02-12 09:46:55

标签: c# wpf data-binding wpfdatagrid

好吧,我正在使用MVVM Light,我尝试过该解决方案,在事件selectionChanged中传递datagrid的selectedItems作为参数。所以我可以获得选定项目,我可以在视图模型中更新我的变量。

在第一时刻,这是一个很好的解决方案。问题是,如果我在我的视图模型中将SelectedIndex属性设置为-1以取消选择all或将SelectedItem属性设置为null,则不会触发事件selectionChanged。我想这真的很好,因为为什么视图会通知视图模型在视图模型中第一时刻改变的属性的变化?这不会创建周期,但是我需要手动清除我的视图模型中的SelectedItems属性,并且将我的事件OnSelectionChanged上升到另一个视图模型代码的许多部分中的更改。

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

我有哪些替代方案?

谢谢。

1 个答案:

答案 0 :(得分:2)

在所选项目的设置器中使用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用于隐式传递调用成员的名称。