【问题标题】:C# MVVM Model Graph Message Mediator or INotifyPropertyChanged?C# MVVM 模型图消息中介或 INotifyPropertyChanged?
【发布时间】:2019-10-28 17:21:05
【问题描述】:

我正在开发一个 C# MVVM WPF 应用程序,但在决定是否应该为我的 UI“实时”模型更改通知使用消息中介模式或简单的 INotifyPropertyChanged 时遇到问题。尤其是问题在于,我的模型表示一个包含许多“活动”对象的图形,这些对象都具有不同的视图模型在某些时候会对更改感兴趣的属性。我有大约 3-5 个需要通知模型更改的视图模型处于活动状态。某些更改可能嵌套在模型“孙子”的深处。

我尝试比较两种消息传递技术、中介模式和 INotifyPropertyChanged,并认为中介更适合不同模块/系统之间的更改通知。我的视图模型在初始化时肯定需要模型的初始值,然后再更改通知。在我的情况下,INotifyPropertyChanged 似乎是最佳选择,但我有点怀疑,因为我认为很多 nameof(e.PropertyName) 开关情况不是很优雅。这个问题有更好的替代方案吗?

【问题讨论】:

  • Mediator就是解耦组件。与任何模式一样,它是有代价的,并且会增加一定的复杂性。我同意非常通用的INotifyPropertyChanged 接口不舒服,因为它需要开关。它有不同的用途,首先是由框架(数据绑定引擎)使用的。如果解耦不是问题,我会选择专用的,即命名事件。代码读起来更好,您将消除 switch 语句。最好有一个名为 PriceChanged 的事件,而不是一个通用的 PropertyChanged 并过滤 Price 属性。

标签: c# graph model inotifypropertychanged mediator


【解决方案1】:

通常情况下,您可以同时采用这两种方式。您显然无法避免使用INotifyPropertyChanged,因为这是处理基于 MVVM 的数据绑定的 WPF 方式,因此您的所有视图模型将至少是此接口的基本实现。

我怀疑您可能只需要两者。我不建议在模型中使用基于 INotifyPropertyChanged 的模式。创建这个接口的原因是观察者模式基于实际的属性名称作为字符串。这几乎是一条“单行道”,因为支持 WPF 的典型“设计”语言 XAML"stringly" 方式解析,几乎没有有效的替代方案。以我的拙见,您几乎没有理由希望在整个模型中强制通知像这种情况一样弱类型(实际上是字符串类型),所以我建议避免 INotifyPropertyChanged 如果你有相对庞大的领域模型。

消息传递可能是要走的路,使用消息类型注册和诸如此类的东西来维护强类型,除非您想考虑其他替代方案,例如简单的 C# 事件,或者甚至将两者结合起来。在此过程中,尽量坚持并坚持层次结构和封装,但也要尽可能弱*。

(*我的意思是,如果您的某些域对象达到多个嵌套级别,那么有时,绕过层次结构并让孙辈发送自己的消息而不是通知他们的消息可能更实际父母的父母通过事件,并让这些父母的父母然后发送相应的通知消息。在典型的 OOP 编程中,妥协不断权衡实用性和时间可用性)。

【讨论】:

  • 很高兴听到关于该主题没有明确的正确答案。 Msdn 说模型应该实现 INotifyPropertyChanged 以将更改传播到 VM docs.microsoft.com/en-us/previous-versions/msp-n-p/… 。我也认为混合通知系统可能是要走的路。现在我坚持使用 INotifyPropertyChanged,直到我发现比较字符串太痛苦了。
猜你喜欢
  • 2011-07-14
  • 2011-06-25
  • 1970-01-01
  • 2011-11-17
  • 2013-05-27
  • 2013-08-31
  • 2011-10-18
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多