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

时间:2012-11-19 20:44:15

标签: c# mvvm properties views

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

Model包含两个属性:UsernamePassword

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

我该如何处理?

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

1 个答案:

答案 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已订阅该事件,并正在监听发布者向其发送消息。

使用这种方法,您可以让您的视图模型进行通信,而无需彼此参考。