我正在使用MVVM模式对WPF应用程序进行原型设计。该应用程序应具有两个窗口:MainWindow
和LoginWindow
。
Model
包含两个属性:Username
和Password
。
LoginWindow
负责处理用户输入的用户名和密码,因此相应的视图模型会更新这些属性。但是,MainWindow
还需要访问用户名和密码,以便以后使用客户端对象。
我该如何处理?
将Model
中创建的LoginViewModel
实例传递给MainWindowViewModel
的构造函数?
答案 0 :(得分:1)
您需要的是Messenger / Event Aggregator。事件聚合器是一个代理对象,您可以引用该对象并指定要接收的事件类型,而无需参考或甚至不知道生成事件的对象。
Prism的EventAggregator是最常见的。请参阅:Event Aggregator
所以:
ViewModel 1:
public ViewModel1(IEventAggregator eventAggregator)
{
_eventAggregator=eventAggregator;
}
private void SendMessage()
{
_eventAggregator.GetEvent<UserLogin>().Publish(new UserLogin(_userName,_password);
}
ViewModel 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
}
正在发生的事情是将eventaggregator传递给两个视图模型。 ViewModel1发布消息但不知道谁(如果有人)正在收听它。 ViewModel2已订阅该事件,并正在监听发布者向其发送消息。
使用这种方法,您可以让您的视图模型进行通信,而无需彼此参考。