目前我正在使用DI在虚拟机之间传递数据,想象一下搜索页面和结果页面或主/细节的情景。
所以在这种情况下,我应该创建一个VM(带或不带模型),我称之为“参数VM”来存储我的搜索参数,并在详细信息或结果VM中读取它们。
此外,我在VMLocator中注册此参数VM,并将其注入两个VM的构造函数中。
我得到的是,当我搜索新数据并存储数据以在此参数VM中搜索时,我也成功地在结果/详细信息VM中获取数据。
所以这是一个使用MVVM Light的成熟模式,虽然在网络上没有很好的文档记录,我的问题是,这是一个在性能和代码可读性方面的好方法。我想知道是否有人使用其他方法而不使用MVVM Light中的Messaging系统。
我对这种方法的烦恼是我必须将我的参数封装在继承ViewModelBase的VM中,如果我想注入一个普通的类我不能将更改传播到第二个VM,我仍然不知道为什么我不能用简单的课程做同样的事情,我想知道是否有人知道这个原因。我在VM中创建一个简单类的原因是因为在WP和W8中,我可以使用VMLocator中的工厂在停用和激活应用程序时恢复模型的状态。
感谢您的评论!
答案 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