从另一个视图模型更新一个视图模型
本文关键字:模型 视图 一个 更新 另一个 | 更新日期: 2023-09-27 17:50:36
我有两个ViewModels,一个附加到主窗口,另一个附加到通过单击主窗口上的按钮打开的子窗口。子窗口包含一个项目列表,我想通过更新主窗口视图模型来选择一个项目并在主窗口中显示它。要做到这一点,最好的方法是什么?谢谢!
有很多方法可以做到这一点。
-
将对主/父视图模型的引用传递给子视图,并让子视图调用主视图模型。
-
让子视图模型触发父视图订阅的事件。
-
使用信使/中介器在两者之间通信。父节点订阅,子节点发布消息。
-
将主视图模型设置为全局服务。注册一下。让子进程查找服务(需要全局服务是一个相当常见的问题),然后在全局/公共接口上调用一些东西。
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);
最好的方法是有某种从子节点到父节点的引用,并在关闭子节点时更新父节点。
或者你可以在child上设置某种事件,让parent监听这个事件。然后在child关闭时引发此事件。
当两个viewmodel在逻辑上不相关时使用消息传递。
人们连面向对象编程的基本原理都不知道吗?[/咆哮]几天前我也遇到过同样的问题;-)
最后,我使用中介来通信两个视图模型。事实上,我用的是MVVM Light中的Messenger。
public void Search(object parameter)
{
ChildWindow window = new ChildWindow();
SearchWindow pageSearch = new SearchWindow();
window.Content = pageSearch;
window.Show();
Messenger.Default.Register<Messages.CloseWindowMessage>(this, action => this.closeWindow(action));
}
之后,我用主窗口中需要知道的所有内容定义了Message:
public class CloseWindowMessage : MessageBase
{
public bool Result { get; set; }
public Model.Selected Selected { get; set; }
}
最后消息从子窗口返回,你只需要注册消息与结果和你想要返回的对象。
您应该从视图的代码后端注册以关闭窗口
我认为在两个视图模型之间传递消息的最好方法是事件编程。