4

考虑以下情形:视图模型视图模型来沟通

  1. ViewModelA推出ViewModelB(通过一个共同的控制器,当然,使用IOC和DI解决所需要的类型)。
  2. ViewModelB需要在ViewModelA中设置一个属性值。

通过构造函数注入简单地将ViewModelA注入ViewModelB并直接设置属性是不好的?

或者......

如果一个邮件系统像棱镜的EventAggregator被用来处理的ViewModels之间的所有通信?

我喜欢注射方法,因为它很容易,但我的直觉告诉我我错过了一些东西。我呼吁你集体的智慧来帮助填补我的盲点。

回答

1

我建议你阅读this question (and my answer),因为它很相似,但不完全是你的问题。它处理父/子ViewModel对象之间的属性通信。

让我们看一个简单的例子:

  • ViewModelA是父母必须对B存在某些属性的总和
  • ViewModelB是儿童和有需要总结
属性

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

ViewModelA可以订阅所有孩子的活动,但走下了这条路,我不喜欢它。当孩子被添加和删除时,你需要做很多记录。

将A注入B更清洁,但您仍然需要大量的簿记工作。如果你对A有“清除儿童”行为会怎么样?在所有情况下,你必须记得妥善摆脱B到A的父母关系。在我看来,它比事件更好,因为它更加明确。

我个人喜欢这个消息传递的想法。我对MVVM Light的使者比Prism更熟悉,但它也是一个全球性的消息总线。任何时候,任何B都可以说“我改变了我的财产!”然后A监听通知并执行计算本身。我认为这是您最简洁的解决方案,而且更少簿记。

+0

我最终创建了一个包装EventAggregator的Publish/Subscribe/Unsubscribe操作的MessagingService。 MessagingService被注入到ViewModelBase类中,因此我的应用程序中的任何ViewModel都可以使用它。 – 2011-01-28 22:41:57

+0

@Chris Swain - 我喜欢它。如果我必须将ViewModel与ViewModel进行通信,那么我将在未来采用这种方法。但是,在我最近的工作中,我通过强制模型中的所有通信来避免所有这些情况。当模型中发生任何变化时,我的Presenter知道它并告诉顶层ViewModel有可能发生了变化。然后,它向树和所有子级,孙级等传递一个通知,ViewModels检查它们的模型数据以查看是否有任何更改。 – 2011-01-29 16:52:11

2

如果您需要双向引用,我认为它是一种代码异味。通常,您可以用替换其中一个参考文献,其事件为

让ViewModelB引发ViewModelA预订的事件。一个完整的消息系统就像在Prism中找到的那样,当然是一种选择,但在你的场景中,这听起来像是一个'正常'的事件会很好。

0

我建议使用更轻的专用Messaging解决方案称为“Light Message Bus”。它不是任何其他的一部分;-) MVVM框架,但独立的组件。我在不到3分钟的时间内即可完成工作。