2012-11-19 123 views
1

我正在使用MVVM模式构建WPF应用程序原型。申请应有两个窗口:MainWindowLoginWindow如何在两种不同视图模型中使用相同的模型数据?

Model包含两个属性:UsernamePassword

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

我该如何处理?

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

回答

1

你需要的是一个Messenger/Event Aggregator。事件聚合器是一个代理对象,您可以引用该代理对象并指定要接收的事件类型,而无需参考甚至不需要知道生成事件的对象。

棱镜的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 
} 

发生了什么事是,eventaggregator传递给双方的ViewModels。 ViewModel1发布消息,但不知道谁(如果有的话)正在收听。 ViewModel2订阅了该事件并正在侦听发布者向其发送消息。

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

相关问题