必要なのは 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
}
何が起こっているかというと、eventaggregator が両方のビューモデルに渡されます。ViewModel1 はメッセージを発行しますが、誰が (もし誰かが) 聞いているかを知りません。ViewModel2 はイベントをサブスクライブし、パブリッシャーがメッセージを送信するのをリッスンしています。
このアプローチを使用すると、ビューモデルが相互に参照を取得することなく通信することができます。