MVVM中如何通过ViewModel属性良好地传递INotifyPropertyChanged事件?

17

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

我的问题是,即使Address实现了INotifyPropertyChanged,绑定也不会得到更新,因为它正在处理PersonModelView上的PropertyChanged,而不是Address。 我认为我有两个选择:(1)更改绑定的源(或更改DataContext)到Address属性或(2)让PersonModelView处理Address对象上的PropertyChanged并重新触发其自己的PropertyChanged,例如Address.City

你们是如何解决这个问题的? (我目前正在使用MVVM light工具包,但我对任何方法都很感兴趣)

4个回答

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

我同意。当一个字段绑定到下面一两个级别时,我从未不得不向上传播事件。尝试使用“null”作为属性名称触发“PropertyChanged”,并在属性设置器中设置断点以确保绑定工作正常(或检查输出窗口)。 - Andre Luus
这真是一件令人欣慰的事情,这应该会让我的代码更加优美。我猜我第一次尝试时一定犯了错误,我刚刚在一个新的解决方案中再次尝试并且它正常工作。感谢大家的帮助! - Geoff

3

本,你是不是想再次链接回这个问题? - Andre Luus
额,我认为那个链接不对;)对了,我估计可能有些地方错过了。我曾认为这些绑定处理不了,回到代码中再看看! - Geoff

1

你的 Address 对象是否实现了 INotifyPropertyChanged 接口?如果没有,我认为这可能会解决你所遇到的问题。

编辑: 抱歉,刚刚注意到你在帖子中提到过尝试过这个方法。你是否尝试在 PersonViewModel 中订阅 Address 对象的 PropertyChanged 事件?在 OnChanged 时,你可以对 Address 对象执行 PropertyChanged 操作。


是的,它应该处理。如果绑定是{Binding Address.City},那么绑定是否应该在PersonModelView或Address上处理PropertyChanged事件?(当然,PersonModelView是DataContext) - Geoff
你能发一下你的代码吗?在我看来,你设置的方式应该是可以工作的。你有没有查看“输出”窗口以确保它正确绑定了? - JSprang

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接