0

WPFアプリケーションでMVVMパターンを使用しています。ビューの1つに、クリックするとコマンドを使用してViewModelと通信するボタンがあります。私が抱えている問題は、ViewModelが他のViewModelと通信して、それらのパブリックメソッドのいくつかを呼び出す必要があることです。私はIOC(Unity)を使用し、コンテナーを最初のViewModelに挿入するので、これを使用して他のビューモデルにアクセスできます。これがMVVMの概念に適合するかどうかはわかりません。

すべてのViewModelがワンボタンクリックにサブスクライブすることは可能ですか?これらのいずれかがこの問題を解決するための推奨される方法ですか、それともより良い方法がありますか?

私のアプリケーションについてもう少し説明すると、各ビューはいくつかのテキストボックスを備えたタブコントロールです。最初のタブには、ボタンとコンボボックスもあります。ユーザーは自由に自分のデータを入力したり、コンボからオプションを選択したりできます。この場合、ボタンがクリックされた場合、最初のタブからコンボで選択されたアイテムに基づいてテキストボックスをロードするためにすべてのタブが必要です。どういうわけか、コンボからの値が関連するすべてのビューモデルに渡されるように、このボタンクリックを配線する必要があります。

4

4 に答える 4

2

EventAggregatorを使用できます。他のViewModelがサブスクライブできるイベントをコマンドに公開させます。イベントが発生すると、1つのVMが他のVMを知る必要なしに、すべてのイベントが取得されます。

もう1つのオプションは、通常のコマンドの代わりに複合コマンドを使用することです。ボタンに複合コマンドを使用するコマンドを作成し、他のビューモデルをその複合コマンドに登録します。

于 2013-01-28T14:38:32.593 に答える
0

あなたはこれでいくつかの方法をとることができます:

  • ある種のイベントフレームワークを使用して、何かが発生した場合にすべてのサブスクライバーに通知します。例:PrismEventAggregator。これを機能させるには、明らかにPrismを設定する必要があります。Caliburn.MicroMVVMLightのようなある種のイベント/メッセージシステムをサポートする他の(MVVM)フレームワークがあります

  • MasterViewModelすべてのタブのすべての子ビューモデルを含むを作成します。このようにして、「マスター」はその子からのPropertyChangedイベントをサブスクライブし、適切なアクションを実行できます。または、マスターには、バインドしているコマンドを含めることもできます。

于 2013-01-28T14:41:12.813 に答える
0

なんらかの「メッセンジャー」サービスの利用をお勧めします。これは、「サブスクリプションパターン」を実装するクラスを意味します。

使用しているMVVMライブラリはわかりませんが、CodePlexで入手できる「MVVMLight Toolkit」を見ると、Messengerの非常に軽い実装が見つかります。

基本的に、各ViewModelは特定の通知を受信するようにサブスクライブし、コンボボックスとボタンを備えたViewModelは、ボタンがクリックされたときにメッセージを公開します。メッセージの送信方法は非常に柔軟であり、ViewModelはお互いについて何も知る必要がありません。

于 2013-01-28T14:44:25.263 に答える
0

GalaSoftのMVVMliteツールキットを使用している場合は、Messengerにアクセスして、各ビューモデルでサブスクライブできるメッセージを送信できます。

// Send message from command handler
Messenger.Default.Send<MyMessage>(new MyMessage());

// Register for message in view models.
Messenger.Default.Register<MyMessage>(this, MyMessageReceived);

// Method to do work
private void MyMessageReceived(MyMessage myMessage)
{
// Do Work
}
于 2013-01-28T14:44:54.340 に答える