看起来WPF并不总是调用PropertyChangedCallback
的注册DependencyProperty
过程。即使我们从VM手动提升PropertyChanged
事件,WPF似乎实际上在评估它是否会调用回调之前评估该属性的旧值和新值。所以我的问题是:
我的ViewModel的公共属性定义如下:
Public ReadOnly Property CurrentSelection() As ObservableCollection(Of Object)
我的视图绑定到此属性(BetterPropertyGrid是一个UserControl,它包含一个WinForms PropertyGrid
并且DependencyProperty
名为SelectedObjects
}:
<bd:BetterPropertyGrid SelectedObjects="{Binding CurrentSelection}" />
现在,只要我的ViewModel在CurrentSelection中添加或删除对象,我就会手动引发PropertyChanged("CurrentSelection")
,但它似乎不会更新我的View。
答案 0 :(得分:9)
WPF检查属性值是否与引发更改通知之前的属性值实际不同。在您的情况下,从视图模型属性getter返回相同的集合实例,因此更改无效。
&#34;为什么会这样?&#34;:因为旧的和新的财产价值相等。在PropertyChangedEventArgs
传递给您的PropertyChangedCallback e.OldValue
和e.NewValue
将引用相同的集合实例。
&#34;解决方法是什么?&#34;:为INotifyCollectionChanged.CollectionChanged
属性值的SelectedObjects
事件注册处理程序,如this answer所示。