使用MVVM通过ViewModel属性冒泡INotifyPropertyChanged事件的好方法是什么?

时间:2010-10-14 12:49:38

标签: c# wpf mvvm mvvm-light

我正在尝试找出在我的ModelView中从嵌套属性冒泡PropertyChanged事件的最佳方法。假设我的ModelView PersonModelView具有属性PersonModelView.AddressAddress又有一个属性City。当我在视图中绑定City时,我会执行{Binding Address.City}之类的操作。

我的问题是,即使Address实现INotifyPropertyChanged,绑定也不会更新,因为它正在PropertyChanged上处理PersonModelView而不是 Address。我想我有两个选择:(1)更改绑定源(或将DataContext更改为)Address属性或(2)更改PersonModelView句柄{{1}在PropertyChanged对象上使用Address等内容重新发送自己的PropertyChanged

你们是怎么解决这个问题的? (我在mo使用MVVM light toolkit,但我对任何方法感兴趣)

4 个答案:

答案 0 :(得分:8)

如果Address实现INotifyPropertyChanged并在其PropertyChanged属性上正确引发City个事件,则绑定应注意到它绑定的属性已更改。

答案 1 :(得分:3)

这是一个SO线程,其中包含有关如何冒泡这些通知的解决方案: When nesting properties that implement INotifyPropertyChanged must the parent object propogate changes?

然而,当控件的绑定设置为Address.City时,IIRC WPF可以自动监视INotifyPropertyChanged通知的地址,而PersonViewModel不需要重新广播Address对象的更新通知。

答案 2 :(得分:1)

您的Address对象是否实施INotifyPropertyChanged?如果没有,我认为这将解决您所看到的问题。

修改 抱歉,您刚刚注意到您在帖子中提到您已尝试过此操作。您是否尝试在PersonViewModel中订阅Address对象的PropertyChanged事件? OnChanged,您可以在Address对象上执行PropertyChanged。

答案 3 :(得分:0)

查看PropertyChangedPropagator,它可以处理嵌套视图模型属性的依赖关系,包括动态可更改的嵌套视图模型: http://www.codeproject.com/Articles/775831/INotifyPropertyChanged-propagator