MVVM Light DI在VM之间共享数据?

时间:2013-04-08 19:09:37

标签: design-patterns mvvm dependency-injection mvvm-light

目前我正在使用DI在虚拟机之间传递数据,想象一下搜索页面和结果页面或主/细节的情景。

所以在这种情况下,我应该创建一个VM(带或不带模型),我称之为“参数VM”来存储我的搜索参数,并在详细信息或结果VM中读取它们。

此外,我在VMLocator中注册此参数VM,并将其注入两个VM的构造函数中。

我得到的是,当我搜索新数据并存储数据以在此参数VM中搜索时,我也成功地在结果/详细信息VM中获取数据。

所以这是一个使用MVVM Light的成熟模式,虽然在网络上没有很好的文档记录,我的问题是,这是一个在性能和代码可读性方面的好方法。我想知道是否有人使用其他方法而不使用MVVM Light中的Messaging系统。

我对这种方法的烦恼是我必须将我的参数封装在继承ViewModelBase的VM中,如果我想注入一个普通的类我不能将更改传播到第二个VM,我仍然不知道为什么我不能用简单的课程做同样的事情,我想知道是否有人知道这个原因。我在VM中创建一个简单类的原因是因为在WP和W8中,我可以使用VMLocator中的工厂在停用和激活应用程序时恢复模型的状态。

感谢您的评论!

2 个答案:

答案 0 :(得分:1)

我们在模块化WPF应用程序中使用EventAggregator模式。在这种情况下,您的视图模型不需要彼此了解。相反,它们共享一个IEventAggregator服务的实例,它作为构造函数参数注入。然后,Master ViewModel发布具有特殊事件类的事件(例如,当选择更改时),并且详细信息ViewModel订阅该类型的事件,并在事件发生时对它们做出反应(通过显示新的详细信息)。使用此模式,您可以设置不同项目中的视图模型的通信,而无需任何紧密耦合。当然,两个视图模型都共享他们可以处理的事件类的知识。

互联网上有各种这种模式的实现。其中一些可以直接从VisualStudio安装NuGet,例如Caliburn.Micro.EventAggregator

希望有帮助=)

答案 1 :(得分:0)

根据我的经验,使用Messenger是以分离方式在VM之间进行通信的最佳方式,我想到了IOC,特别是MVVM Light中的SimpleIOC,它将依赖关系注入虚拟机,如存储库,服务等。

View ----RelayCommand---> VM

VM ----Messenger----> VM

Repositories ---- SimpleIOC ---> VM