如何在两个不同的视图模型中使用相同的模型数据?

Posted

技术标签:

【中文标题】如何在两个不同的视图模型中使用相同的模型数据?【英文标题】:How can I use identical model data in two different view models? 【发布时间】:2012-11-19 20:44:14 【问题描述】:

我正在使用 MVVM 模式对 WPF 应用程序进行原型设计。该应用程序应有两个窗口:MainWindowLoginWindow

Model 包含两个属性:UsernamePassword

LoginWindow负责处理用户输入的用户名和密码,因此相应的视图模型会更新这些属性。但是,MainWindow 还需要访问用户名和密码,以便以后与客户端对象一起使用。

我应该如何处理?

LoginViewModel中创建的Model的实例传递给MainWindowViewModel的构造函数?

【问题讨论】:

【参考方案1】:

您需要的是一个 Messenger/Event Aggregator。事件聚合器是一个代理对象,您可以对其进行引用并指定要接收的事件类型,而无需获取引用,甚至无需了解生成事件的对象。

Prism 的 EventAggregator 是最常见的一种。见:Event Aggregator

所以:

视图模型 1:

public ViewModel1(IEventAggregator eventAggregator)

    _eventAggregator=eventAggregator;

private void SendMessage()

    _eventAggregator.GetEvent<UserLogin>().Publish(new UserLogin(_userName,_password);

视图模型 2:

public ViewModel2(IEventAggregator eventAggregator)

    _eventAggregator=eventAggregator;
    _eventAggregator.GetEvent<UserLogin>().Subscribe(UserLoginReceived,ThreadOption.BackgroundThread,true);


private void UserLoginReceived(UserLogin login)

  //do what you like here

发生的事情是 eventtaggregator 被传递给两个视图模型。 ViewModel1 发布一条消息,但不知道谁(如果有人)正在收听它。 ViewModel2 已订阅该事件并正在监听发布者向其发送消息。

使用这种方法,您可以让视图模型进行通信,而无需它们相互引用。

【讨论】:

以上是关于如何在两个不同的视图模型中使用相同的模型数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据

两个不同的深度学习框架如何使用相同的模型?

PyQt5 模型/视图 - 一个模型,两个视图

如何将两个不同的ListAPIView转换为单个ModelViewSet

如何在同一视图中使用具有不同数据源的多个选取器视图?

在两个不同的 Django 项目之间共享模型