您需要的是一个 Messenger/Event Aggregator。事件聚合器是一个代理对象,您可以对其进行引用并指定要接收的事件类型,而无需获取引用,甚至无需了解生成事件的对象。
Prism 的 EventAggregator 是最常见的一种。请参阅:事件聚合器
所以:
视图模型 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 已订阅该事件并正在侦听发布者向其发送消息。
使用这种方法,您可以让您的视图模型进行通信,而无需它们相互引用。