【问题标题】:Prevent DataGrid from updating selected item in MVVM防止 DataGrid 更新 MVVM 中的选定项
【发布时间】:2015-01-12 01:29:26
【问题描述】:

我有一个 Datagrid,其中有一个绑定到 ItemsSource 的列表,并且 SelectedItem 绑定了这个列表的单个对象。我的 ViewModel 实现了 INotifyPropertyChanged。

绑定工作正常,除非有一个变量 (canSelectOtherObject = false) 阻止 myObject 更改它的值。即使 myObject 没有修改它的值,视图上的数据网格也会选择其他对象。我怎样才能防止这种情况发生?

查看:

<DataGrid ItemsSource="{Binding MyObjectList}" SelectedItem="{Binding MyObjectSelected, Mode=TwoWay}">

视图模型:

private ObservableCollection<MyObject> myObjectList;
private MyObject myObjectSelected;
private bool canSelectOtherObject;

public ObservableCollection<MyObject> MyObjectList
{
    get { return myObjectList; }
    set { myObjectList = value; }
}

public MyObject MyObjectSelected
{
    get { return myObjectSelected; }
    set
    {
        if(canSelectOtherObject)
        {
            myObjectSelected = value;
            OnPropertyChanged("MyObjectSelected");
        }
    }
}

谢谢!

【问题讨论】:

  • 尝试将 OnPropertyChanged 移到 if 语句之外,这应该会导致绑定刷新并重新选择您期望的 SelectedItem。然而,它对用户来说可能看起来有点奇怪。
  • 我试过了,但还是没有成功。
  • 尝试将 IsSynchronizedWithCurrentItem 属性设置为 true? msdn.microsoft.com/en-us/library/…

标签: c# wpf mvvm binding datagrid


【解决方案1】:

INotifyPropertyChanged 用于在对象的属性发生更改时通知 UI 更新绑定,我认为您描述的是对象本身发生更改的情况。

鉴于您的绑定:

&lt;DataGrid ItemsSource="{Binding MicrophoneList}" SelectedItem="{Binding MicrophoneSelected, Mode=TwoWay}"&gt;

这是更新所选麦克风的属性之一(需要INotifyPropertyChanged)和将SelectedItem 更改为完全不同的麦克风(无论您是否通知都绑定更新)之间的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多