【问题标题】:How can I binding the SelectedItems property of a DataGrid in MVVM?如何在 MVVM 中绑定 DataGrid 的 SelectedItems 属性?
【发布时间】:2016-02-12 09:46:54
【问题描述】:

好吧,我正在使用 MVVM Light,并且我已经尝试了在事件 selectionChanged 中将数据网格的 selectedItems 作为参数传递的解决方案。所以我可以获取选定的项目,我可以在视图模型中更新我的变量。

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

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

我有哪些选择?

谢谢。

【问题讨论】:

  • 尝试两种绑定方式即SelectedItem="{Binding SelectedRow, Mode=TwoWay}"

标签: c# wpf data-binding wpfdatagrid


【解决方案1】:

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

【讨论】:

  • 感谢您的建议,但这是我的方式,但它不起作用。奇怪的是,如果我在视图模型中将 Selectedindex 设置为 -1,则属性 SelectedItem 设置为 null,所以看起来视图设置了 SelectedItem,但事件没有上升。
  • 你能把你的ModelViewViewModel的相关代码贴出来吗?
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2023-03-13
  • 2011-09-18
  • 2013-05-16
  • 2015-07-24
  • 2011-12-04
相关资源
最近更新 更多