ViewModel 到 ViewModel 通信

Chr*_*ain 5 dependency-injection inversion-of-control mvvm viewmodel eventaggregator

鉴于以下场景:

  1. ViewModelA 启动 ViewModelB(通过一个公共控制器,当然,它使用 Ioc 和 DI 来解析所需的类型)。
  2. ViewModelB needs to set a property value in ViewModelA.

Is it bad to simply inject ViewModelA into ViewModelB via constructor injection and just set the property directly?

Or…

Should a messaging system like the EventAggregator from Prism be used to handle all communication between ViewModels?

I like the injection approach because it’s easy, but my instincts are telling me I’m missing something. I call on your collective wisdom to help fill in my blind spot.

Sco*_*ock 1

我建议您阅读这个问题(和我的答案),因为它很相似,但不完全是您的问题。它确实处理父/子 ViewModel 对象之间的属性通信。

让我们看一个基本的例子:

  • ViewModelA是父级并且必须提供 B 上某些财产的总和
  • ViewModelB是孩子并且有一个需要求和的属性

因此,用户请求编辑 B 上的属性,并且请求成功,因此 B 可能会更改其属性的值并触发事件PropertyChanged

ViewModelA可以订阅所有孩子的活动,但沿着这条路走下去,我不喜欢它。添加和删​​除子项时,您需要做大量簿记工作。

将 A 注入 B 更干净,但您仍然需要做很多簿记工作。如果你对A采取“清除儿童”行动怎么办?在任何情况下,你都必须记住正确地摆脱 B 与 A 的亲子关系。在我看来,它仍然比事件更好,因为它更明确。

我个人喜欢消息传递的想法。我比 Prism 更熟悉 MVVM Light 的信使,但它们的想法是一样的……全局消息总线。任何时候,任何B都可以说“我改变了我的财产!” 然后 A 监听通知并自行进行计算。我认为这是最干净的解决方案,记账工作要少得多。