在两个ViewModel之间传输数据

3

我在我的WPF应用程序中有两个视图和两个视图模型。我正在使用MVVM ViewModelLocator在我的视图模型之间传递数据。这是推荐的做法吗?有更好的方法来实现吗?我目前正在使用这段代码在ViewModel1中访问ViewModel2的属性

var _viewmodel2 = (Application.Current.Resources["Locator"] as ViewModelLocator).ViewModel2;

谢谢


您还可以将一个单例ISharedData注入到每个虚拟机中。 - Derek Beattie
2个回答

3
你需要的是事件聚合器模式。它将使用一个中心“聚合器”对象和订阅/触发事件(带有效负载)来传递数据。如果您的场景足够复杂,那么这有点复杂。如果你的情况不是特别复杂,你可以在视图模型A和视图模型B之间维护一份引用,并进行双向数据共享。这似乎就是你在 ViewModelLocator 中所做的事情(实际上在幕后使用 DI 来解析你想要的ViewModel实例)。这不会违反 MVVM 模式。你只需要确保在数据共享过程中,如果你正在跨视图模型订阅任何事件(与事件聚合器解决方案相同),请务必清理好自己的代码。具体信息可以参见之前的这篇 SO 论坛文章:here

我现在正在使用MVVMLight Messenger将字符串从一个ViewModel传递到另一个ViewModel。我的设置并不复杂,所以我想不需要使用事件聚合器。您对使用Messenger实现此目标有何看法? - azmuhak
我之前不熟悉MVVMLight Messenger,所以去查了一下。事件聚合器是一种模式,而这个MVVMLight Messenger看起来像是该模式的一种实现 :) 但是根据我的经验,它会伴随着相当大的开销和性能损失,但这可能只与我使用的实现(内部工具包)有关。你使用MVVMLight messenger是否有同样的问题? - Tom Florkiewicz
是的,它确实有一些开销,但性能影响并不大。但是我认为,如果Laurent Bugnion使用Event Aggregator来创建MVVMLight工具包的Messenger服务,那么最好使用该方法,因为这种实现始终符合MVVM模式。 - azmuhak

0
如果您在服务定位器或IoC容器中注册了您的视图模型,那么您可以直接从中获取引用。
SimpleIoc.Default.GetInstance<MyViewModel>()

上面的例子使用了MvvmLight


是的,这就是我在原问题中目前正在使用的方法,我的问题是,是否存在使用此方法的负面影响?是否有更好的方式?所谓的负面影响是指创建实例时的性能问题,当应用程序变得越来越大时,往返引用将增加。 - azmuhak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接