C# MVVM 模型图消息中介或 INotifyPropertyChanged?

C# MVVM Model Graph Message Mediator or INotifyPropertyChanged?

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

我尝试比较这两种消息传递技术、调解器模式和 INotifyPropertyChanged,并认为调解器更适合不同 modules/systems 之间的更改通知。我的视图模型在初始化时肯定需要模型的初始值,然后再更改通知。 INotifyPropertyChanged 似乎是我的最佳选择,但我有点怀疑,因为我认为很多 nameof(e.PropertyName) 切换案例都不是很优雅。这个问题有更好的选择吗?

在这种情况下,通常情况下,您可以同时使用这两种方法。您显然无法避免使用 INotifyPropertyChanged,因为这是处理 MVVM-based 数据绑定的 WPF 方式,因此您所有的 view-models 都将至少是该接口的基本实现。

我怀疑您可能两者都需要。我不建议在模型中使用基于 INotifyPropertyChanged 的模式。创建此接口的原因是将观察者模式基于实际的 属性 名称,如 strings。这几乎是 "one-way street",因为支持 WPF 的典型 "design" 语言 XAML"stringly" 方式解析,几乎没有有效的替代方案。以我的愚见,你几乎没有理由想要在整个模型中强制通知像这种情况一样 weakly-typed(实际上是 stringly-typed),所以我建议避免 INotifyPropertyChanged 如果你有一个相对庞大的领域模型。

消息传递可能是可行的方法,维护 strong-typing 消息类型注册和诸如此类的东西,除非您想考虑其他替代方案,例如简单的 C# 事件,或者甚至将两者结合起来。在这样做的同时,尽可能强烈地坚持并坚持层次结构和封装,但也要尽可能地弱化*。

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