未调用 PropertyChangedCallback
PropertyChangedCallback not called
看起来 WPF 并不总是调用 DependencyProperty
的已注册 PropertyChangedCallback
过程。即使我们从 VM 手动引发 PropertyChanged
事件,WPF 似乎在决定是否调用回调之前实际评估 属性 的旧值和新值。所以我的问题是:
- 为什么会这样?
- 解决方法是什么?
详情
我的 ViewModel 有一个 public 属性 定义如下:
Public ReadOnly Property CurrentSelection() As ObservableCollection(Of Object)
我的视图像这样绑定到这个 属性(BetterPropertyGrid 是一个 UserControl,其中包含一个 WinForms PropertyGrid
并且有一个名为 SelectedObjects
的 DependencyProperty
):
<bd:BetterPropertyGrid SelectedObjects="{Binding CurrentSelection}" />
现在,每当我的 ViewModel 从 CurrentSelection 添加或删除对象时,我都会手动引发 PropertyChanged("CurrentSelection")
,但它似乎不会更新我的视图。
WPF 检查 属性 值是否实际上不同于发出更改通知之前的值。在您的情况下,从视图模型 属性 getter 返回相同的集合实例,因此更改无效。
"Why is this so?":因为新旧属性值相等。在传递给您的 PropertyChangedCallback 的 PropertyChangedEventArgs
中,e.OldValue
和 e.NewValue
将引用相同的集合实例。
"What is the workaround?":为SelectedObjects
属性值的INotifyCollectionChanged.CollectionChanged
事件注册一个handler,如this answer.
看起来 WPF 并不总是调用 DependencyProperty
的已注册 PropertyChangedCallback
过程。即使我们从 VM 手动引发 PropertyChanged
事件,WPF 似乎在决定是否调用回调之前实际评估 属性 的旧值和新值。所以我的问题是:
- 为什么会这样?
- 解决方法是什么?
详情
我的 ViewModel 有一个 public 属性 定义如下:
Public ReadOnly Property CurrentSelection() As ObservableCollection(Of Object)
我的视图像这样绑定到这个 属性(BetterPropertyGrid 是一个 UserControl,其中包含一个 WinForms PropertyGrid
并且有一个名为 SelectedObjects
的 DependencyProperty
):
<bd:BetterPropertyGrid SelectedObjects="{Binding CurrentSelection}" />
现在,每当我的 ViewModel 从 CurrentSelection 添加或删除对象时,我都会手动引发 PropertyChanged("CurrentSelection")
,但它似乎不会更新我的视图。
WPF 检查 属性 值是否实际上不同于发出更改通知之前的值。在您的情况下,从视图模型 属性 getter 返回相同的集合实例,因此更改无效。
"Why is this so?":因为新旧属性值相等。在传递给您的 PropertyChangedCallback 的 PropertyChangedEventArgs
中,e.OldValue
和 e.NewValue
将引用相同的集合实例。
"What is the workaround?":为SelectedObjects
属性值的INotifyCollectionChanged.CollectionChanged
事件注册一个handler,如this answer.