1

MVVM パターンを利用した WPF アプリケーションのプロトタイプを作成しています。アプリケーションには、 と の 2 つのウィンドウがMainWindowありLoginWindowます。

にはとのModel2 つのプロパティが含まれています。UsernamePassword

LoginWindow、ユーザーが入力したユーザー名とパスワードの処理を担当するため、対応するビュー モデルがこれらのプロパティを更新します。ただし、 は、MainWindow後でクライアント オブジェクトで使用するために、ユーザー名とパスワードにもアクセスする必要があります。

これをどのように処理すればよいですか?

Modelで作成されたのインスタンスLoginViewModelMainWindowViewModelのコンストラクタに渡しますか?

4

1 に答える 1

1

必要なのは 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 はイベントをサブスクライブし、パブリッシャーがメッセージを送信するのをリッスンしています。

このアプローチを使用すると、ビューモデルが相互に参照を取得することなく通信することができます。

于 2012-11-19T21:18:41.920 に答える