3

MVVM について、不自然ではありますが簡単な質問をお願いします。

私の MainWindow には 1 つのコントロールがあります - 2 つのビューのうちの 1 つを表示する ContentControl です。ボタンで2つのビューを切り替えられるようにしたい。問題は、ボタンが各ビューのコントロールになることです。EG View1 にはボタンがあり、View2 にはボタンがあります。UI には 1 つのビューのみが表示され、ボタンをクリックすると他のビューが表示されます。ただし、これが機能するためには、View を変更するために、View の ViewModel が MainWindow の ViewModel を認識している必要があることを意味します。これは間違っているようです。

問題は私の MainWindow ViewModelかもしれません。プロジェクトの 1 つは public object View {get;set} で、これが MainWindows ContentControl にバインドされます。したがって、ビューのビューモデルから更新する必要があるのはこのプロパティです。

View が MainWindow の ViewModel を更新する場合、MVVM パターンに反しますか?

4

2 に答える 2

3

あなたの質問を完全に理解しているかどうかはわかりませんが、ビューモデル間で通信するための優れた手法は、EventAggregator または Messenger パターンを使用することです。これら 2 つは、疎結合の方法で pub/sub を実装します。

これは MVVMLight Toolkit の Messenger の例です http://dotnet.dzone.com/articles/mvvm-light-whats-messenger

これは、Viemodel 間で通信する Prism の EventAggregator の例です http://rachel53461.wordpress.com/2011/06/05/communication-between-viewmodels-with-mvvm/

お役に立てれば..

編集:わかりました、私の答えはまだ有効です。上記のように pub/sub を使用する場合は、たとえばビュー変更メッセージを送信してターゲットを定義するように指示view1view2ます (ターゲットはview2たとえば)。MainViewModel次に、すべての変更ビュー メッセージにサブスクライブします。そして、ビューの変更メッセージが到着したとき。はMainViewModel通知を受け取り、イベントを実行します。メッセージの送信者を必ずしも知る必要はありません。

そして、mvvm は単なるパターンであり、宗教ではないことを覚えておいてください...あなたを動かし続けるものを使用し、パターンを頭の後ろに持ってください =)...

于 2013-02-19T11:20:27.857 に答える
1

ビューモデルは、理想的にはビューへの参照を持たないようにする必要があります。MVVM を実行している場合は、MVVM フレームワークを使用する必要があります。あなたが説明しているのは、他の2つのビューモデルを実行しているビューモデルのようです。

個人的には、メッセージに関心のあるサブスクライバーが 1 つしかない場合 (この場合は親メイン ビュー モデル)、イベント アグリゲーターは使用しません。疎結合が必要な場合は、通常の .NET イベントを使用して、標準のイベント パターンを適用できます。

メイン ビュー モデルは 2 つの子ビュー モデルへの参照を保持し、切り替えを開始するイベントをサブスクライブします。ボタンが子 1 でクリックされると、そのイベントが呼び出され、メイン ビュー モデルはイベント ハンドラーの現在のビューを子 2 に切り替えます。

これは、 Caliburn.Microなどの MVVM フレームワークを使用すると非常に簡単です。メイン ビュー モデルはConductorタイプであり、単純にActiveItem.

于 2013-02-19T11:36:17.877 に答える