Wpf 在两个视图模型之间传输数据

Wpf 在两个视图模型之间传输数据,wpf,mvvm,Wpf,Mvvm,我的WPF应用程序中有两个视图和两个视图模型。我正在使用MVVMViewModelLocator在我的ViewModels之间来回传输数据。这是推荐的做法吗?有没有更好的方法来实现这一点?我目前正在使用此代码访问ViewModel1中ViewModel2的属性 var _viewmodel2 = (Application.Current.Resources["Locator"] as ViewModelLocator).ViewModel2; 谢谢您所追求的是类似事件聚合器模式的东西。它将使用

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

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

谢谢

您所追求的是类似事件聚合器模式的东西。它将使用一个中央“聚合器”对象和订阅/引发事件(带有有效负载)来来回传递数据。是的,有点复杂。如果您的场景足够复杂,那么下面是来自上一篇SO文章的更多信息


但是……如果您的场景不那么复杂,您可以在viewmodel a中维护对viewmodel B的引用,反之亦然。这似乎就是您使用ViewModelLocator所做的事情(它实际上在幕后使用DI来解析您所关注的ViewModel实例)。这并不违反MVVM模式。如果在数据共享过程中您订阅了viewmodels中的任何事件(与事件聚合器解决方案的情况相同),您只需确保自己完成清理。

如果您在服务定位器或IoC容器中注册了viewmodels,您只需从那里获取引用即可

SimpleIoc.Default.GetInstance<MyViewModel>()
SimpleIoc.Default.GetInstance()

上面的示例使用MvvmLight

我现在正在使用MvvmLight Messenger将字符串从一个ViewModel传输到另一个ViewModel。我的设置并不复杂,所以我想不需要事件聚合器。您对使用Messenger实现此目标有何看法?我不熟悉MVVMLight Messenger,因此必须查找它。因此,事件聚合器是一种模式,这个MVVMLight Messenger看起来像是该模式的一个实现:)但根据我的经验,它带来了巨大的开销和性能影响,但它可能只是我正在使用的实现(内部工具包)。您在使用MVVMLight messenger时是否遇到过这种情况?是的,它有开销,但不会对性能造成太大影响。但是,我认为如果Laurent Bugnon使用事件聚合器为MVVMLight Toolkit创建MVVMLight Messenger服务,那么使用它会更好,因为此实现将始终符合MVVM模式。您还可以向每个vm中注入一个Singleton,ISharedData。是的,这就是我目前在原始问题中使用的,我在问,使用这种方法是否有不良副作用。有更好的办法吗。所谓坏的副作用,我指的是通过创建实例而产生的性能问题,当应用程序越来越大时,往返引用将增加