9

我正在开发一个 WPF 应用程序,但在将一个视图模型与另一个视图模型通信时遇到了一些问题。

我有:

  1. 主视图模型
  2. ChildViewModel1
  3. ChildViewModel2

每次 MainViewModel 中的属性更改时,ChildViewModel1 和 ChildViewModel2 都应该得到通知。

任何人都可以提出解决方法吗?

编辑:我正在考虑一个描述为 MVVM Light 的解决方案(http://simplemvvmtoolkit.codeplex.com/SourceControl/changeset/view/23821#313594。),即实现消息总线。这是正确的方法吗?

4

3 回答 3

12

在大多数情况下,我不建议使用任何集中的地方来共享“事件”/“通知”,例如 EventAggregator 等。这会导致以后出现与 ViewModel 之间关系不明确的问题。当即使在设计阶段也不知道侦听器/发布者之间的关系时,此类通知在非常特殊的情况下是有意义的。我建议用 ViewModels 之间的关系绘制简单的图表,并找到一种使用标准 .NET 事件的方法,所以当你在 ViewModels 之间有明确的关系时,比如 ViewModel1 有对 ViewModel2 的引用,因此可以订阅事件或提供自己的回调,所以它会易于构建此类事件通知。

于 2013-04-22T14:15:37.293 回答
6

视图模型之间通信的常用方式是中介者设计模式的实现

这是在 MVVMLight http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/27aaefff-e463-451c-87d9-37367a343e0e中的完成方式

在棱镜是:http: //blogs.u2u.be/diederik/post/2011/01/15/Using-the-Prism-40-Event-Aggregator.aspx

在 Caliburn 是: http: //www.mindscapehq.com/blog/index.php/2012/02/01/caliburn-micro-part-4-the-event-aggregator/

于 2013-04-22T14:24:46.650 回答
3

我会使用由每个视图模型实现的 IService。然后在视图模型中,您可以将服务属性传递给实现 INotifypropertychanged 的​​视图模型的属性。例如,我有一个名为 INavigationService 的服务,它由我的视图模型实现,它具有我在视图模型中绑定的 CanNavigate、currentView 等属性。对这些属性的更改可能会导致导航或更改其他视图模型绑定到的属性。

于 2013-04-22T14:11:33.570 回答