从另一个viewmodel更新viewmodel

cod*_*lue 8 c# wpf mvvm viewmodel

我有两个ViewModel,一个连接到主窗口,另一个连接到子窗口,通过单击主窗口上的按钮打开.子窗口包含项目列表,我想通过更新主窗口视图模型来选择项目并在主窗口中显示它.实现这一目标的最佳方法是什么?谢谢!

Jos*_*h G 11

有很多方法可以做到这一点.

  • 将对主/父视图模型的引用传递给子项,并让子项调用主视图模型.

  • 让子视图模型触发父订阅的事件.

  • 使用messenger/mediator在两者之间进行通信.父订阅,孩子发布消息.这提供松耦合.

  • 将主视图模型设置为全局服务.以某种方式注册它.让孩子查找服务(需要全局服务是一个非常常见的问题),然后在全局/公共接口上调用一些东西.

根据我的经验,最简单的方法是#2.在子视图模型上定义事件.父母将不得不查找孩子(我不知道它是否包含它或者你的视图模型是如何构建的)并订阅该事件.


Ada*_*kis 7

ViewModels之间通信的标准方法是使用某种类型的消息.一个很好的实现是MVVM Light Toolkit

这是使用默认信使的一些(随机)代码:

//Registering:
Messenger.Default.Register<IEnumerable<BookViewModel>>(this, true, fillSourceWith);
Messenger.Default.Register<DisplayModeEnum>(this, ChangeMainTemplates);
//with a specific "token"
Messenger.Default.Register<object>(this, MessageTokens.ClearList, o => BookSource.Clear()); 

//Sending
Messenger.Default.Send<List<BookViewModel>>(newBooks);
Messenger.Default.Send<DisplayModeEnum>(DisplayModeEnum.MediumLayout);
Messenger.Default.Send<object>(null, MessageTokens.ClearList);
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里的消息应该没问题.没有消息,你不得不以某种方式结合你的视图模型. (3认同)