【问题标题】:What is a good way to bubble up INotifyPropertyChanged events through ViewModel properties with MVVM?什么是通过 MVVM 的 ViewModel 属性冒泡 INotifyPropertyChanged 事件的好方法?
【发布时间】:2011-04-25 09:32:22
【问题描述】:

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

我的问题是即使Address 实现INotifyPropertyChanged,绑定也不会更新,因为它正在处理PersonModelView 上的PropertyChanged不是Address。我想我有两个选择:(1)将绑定源(或将DataContext)更改为Address属性或(2)在Address对象上使用PersonModelView句柄PropertyChanged和用Address.City 之类的东西重新启动它自己的PropertyChanged

你们是怎么解决这个问题的? (我在 mo 使用 MVVM 轻量级工具包,但对任何方法都感兴趣)

【问题讨论】:

    标签: c# wpf mvvm mvvm-light


    【解决方案1】:

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

    【讨论】:

    • 我同意。当一个或两个级别的字段被绑定到时,我从来不需要向上传播事件。尝试以null 作为属性名称触发PropertyChanged,并在属性设置器中放置一个断点以确保绑定有效(或检查输出窗口)。
    • 这真是一种解脱,它应该使我的代码更好。我想当我第一次尝试这个时我一定犯了一个错误,我只是在一个新的解决方案中再次这样做并且它工作正常。谢谢大家的帮助!
    【解决方案2】:

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

    但是,当控件的绑定设置为 Address.City 时,IIRC WPF 具有智能自动监视 INotifyPropertyChanged 通知的地址,而无需 PersonViewModel 重新广播地址对象的更新通知。

    【讨论】:

    • Ben,你的意思是要再次链接回这个问题吗?
    • 呃,我认为这是错误的链接;)对,我一定错过了什么。我认为绑定无法处理,回到我的代码!
    【解决方案3】:

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

    编辑: 抱歉,刚刚注意到您在帖子中提到您已经尝试过。您是否尝试过在您的 PersonViewModel 中订阅 Address 对象的 PropertyChanged 事件? OnChanged,您可以对您的 Address 对象执行 PropertyChanged。

    【讨论】:

    • 是的。如果绑定是 {Binding Address.City},那么绑定是否应该处理 PersonModelView 或 Address 上的 PropertyChanged 事件? (当然 PersonModelView 是 DataContext)
    • 你能发布你的代码吗?在我看来,您设置它的方式应该可行。您是否查看过“输出”窗口以确保它正确绑定?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2013-12-31
      • 1970-01-01
      • 2021-12-28
      • 2011-06-04
      • 2014-07-10
      相关资源
      最近更新 更多