未调用 PropertyChangedCallback

PropertyChangedCallback not called

看起来 WPF 并不总是调用 DependencyProperty 的已注册 PropertyChangedCallback 过程。即使我们从 VM 手动引发 PropertyChanged 事件,WPF 似乎在决定是否调用回调之前实际评估 属性 的旧值和新值。所以我的问题是:

  1. 为什么会这样?
  2. 解决方法是什么?

详情

我的 ViewModel 有一个 public 属性 定义如下:

Public ReadOnly Property CurrentSelection() As ObservableCollection(Of Object)

我的视图像这样绑定到这个 属性(BetterPropertyGrid 是一个 UserControl,其中包含一个 WinForms PropertyGrid 并且有一个名为 SelectedObjectsDependencyProperty):

<bd:BetterPropertyGrid SelectedObjects="{Binding CurrentSelection}" />

现在,每当我的 ViewModel 从 CurrentSelection 添加或删除对象时,我都会手动引发 PropertyChanged("CurrentSelection"),但它似乎不会更新我的视图。

WPF 检查 属性 值是否实际上不同于发出更改通知之前的值。在您的情况下,从视图模型 属性 getter 返回相同的集合实例,因此更改无效。

"Why is this so?":因为新旧属性值相等。在传递给您的 PropertyChangedCallback 的 PropertyChangedEventArgs 中,e.OldValuee.NewValue 将引用相同的集合实例。

"What is the workaround?":为SelectedObjects属性值的INotifyCollectionChanged.CollectionChanged事件注册一个handler,如this answer.