2012-04-25 21 views
0

MVVMモデルに従って、C#でWPFアプリケーションを作成しています。私は、MenuView、ContentView1、ContentView2、といういくつかのビューからなるMainWindowを持っています。 。 。等々。異なるビュー間でデータを渡す

MenuView、ContentView1、ContentView2。 。 XAMLツリーでのいとこ(煩わしくない)です。

MenuViewはいくつかのボタンで構成されています。各ボタンには固有のIDがあります。コンテンツビュー(すべて)には、選択された(クリックされた)ボタンのメニューIDが表示されます。 つまり、MenuViewのボタンをクリックすると、そのIDをContentsViews1、ContentsViews2などに渡したいとします。

ビュー間でデータを渡す最善の方法がわかりません。

私は、MenuViewにあるすべてのメニューボタンにイベントハンドラを添付すると考えました。ハンドラは、MainWindowクラス(ルートビュー)に実装されています。 このハンドラは、すべての子ビューにRoutedEvent(トンネルオプション付き)を送出します。

良い方法がありますか? パフォーマンスの問題を考慮する最善の方法ですか?

+1

* ViewModels *間でデータを渡さない場合、MVVMのポイントがありません。 – Jon

答えて

0

このアプローチは、あなたが何らかのactionstringを渡す私の長い間行ったJavaの経験に少し思い出させる!?リスナーに。

すべてのボタンを1つのハンドラにバインドしますか?そして、IDに応じて、サブビュー内でアクションを実行したいですか?

はいの場合、すべてのボタンをそれ自身のICommandにバインドし、ハンドラデリゲート内でアクションを実行する必要があります。

+0

はい、これはまさに私がやりたいことです。すべてのボタンをICommandにバインドすると、将来、別のビューを更新する必要がある場合はどうなりますか? Excecuteメソッドを更新する必要があるということですか? –

+0

Jonによると、すべてのビューモデルをイベントに登録することができます。 ICommandでは、単純に異なるイベント(xxxPressedEvent、NewUserEventなど)を発生させます。新たなビュー(モデル)が存在する場合、このオブジェクトは単に正しいイベントに登録するだけです。これは、すべてのイベントとすべてのExecuteメソッドが配置されているMenuViewModelにある可能性があります。 – csteinmueller

0

MenuViewModelには、他の(関心のある)ViewModelsが購読する予定のイベントが公開されていてもかまいません。各ビューは対応するイベントにバインドし、必要な処理を実行できます。

これは、関心のあるViewModelがMenuViewModelの存在をどのように検出し、そのイベントにサブスクライブすることができるかという質問を残しますが、アプリケーションとMVVMフレームワークについての知識がなければ本当に答えられません。

+0

MVVMC(コントローラ用のC)パターンを使用することがあります。コントローラー(名前が示すとおり)はViewModel間の相互作用を制御します。多分、彼はすべてのViewModelにMenuViewModelのインスタンスを与えます。次のステップは、Unityを使用してイベント・アグリゲータを介してViewModelを登録するか、ViewModelロケータを使用することです(MVVMLightを参照)。 – csteinmueller

関連する問題