从另一个视图模型更新一个视图模型

本文关键字:模型 视图 一个 更新 另一个 | 更新日期: 2023-09-27 17:50:36

我有两个ViewModels,一个附加到主窗口,另一个附加到通过单击主窗口上的按钮打开的子窗口。子窗口包含一个项目列表,我想通过更新主窗口视图模型来选择一个项目并在主窗口中显示它。要做到这一点,最好的方法是什么?谢谢!

从另一个视图模型更新一个视图模型

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

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

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

  • 使用信使/中介器在两者之间通信。父节点订阅,子节点发布消息。

  • 将主视图模型设置为全局服务。注册一下。让子进程查找服务(需要全局服务是一个相当常见的问题),然后在全局/公共接口上调用一些东西。

根据我的经验,最简单的方法是#2。在子视图模型上定义一个事件。父类必须查找子类(我不知道它是否包含子类,也不知道你的视图模型是如何构造的)并订阅事件。

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; }
    }

最后消息从子窗口返回,你只需要注册消息与结果和你想要返回的对象。

您应该从视图的代码后端注册以关闭窗口

我认为在两个视图模型之间传递消息的最好方法是事件编程。