如何在两个不同的视图模型中使用相同的模型数据?
Posted
技术标签:
【中文标题】如何在两个不同的视图模型中使用相同的模型数据?【英文标题】:How can I use identical model data in two different view models? 【发布时间】:2012-11-19 20:44:14 【问题描述】:我正在使用 MVVM 模式对 WPF 应用程序进行原型设计。该应用程序应有两个窗口:MainWindow
和 LoginWindow
。
Model
包含两个属性:Username
和 Password
。
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 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据