1

次の部分で構成されるアプリケーションの領域に取り組んでいます。

  • Explorer - TreeView を含む
  • PropertyInspector - PropertyGrid を含む
  • エディター - エクスプローラーと PropertyInspector が含まれています

ご覧のとおり、パーツは階層的に編成されています。私の質問は次のとおりです。エクスプローラーで使用されるツリー ビューで選択されたアイテムを、プロパティ インスペクターで使用されるプロパティ グリッドの選択されたオブジェクトにするにはどうすればよいですか?

ツリー ビューで SelectedItemChanged イベントが発生すると、コマンドが ExplorerViewModel に送信されます。PropertyGrids SelectedObject は、PropertyInspectorViewModel のプロパティにバインドされています。2 つのビュー モデルを接続するにはどうすればよいですか? 1 つの方法として、EditorViewModel が PropertyInspectorViewModel のメソッドを、コマンドを受信したときに ExplorerViewModel によって発生したイベントにアタッチできるようにすることもできますが、これは正しい方法ですか、それともデータ バインディングによって解決できますか?

エディターがツリー ビューとプロパティ グリッドを直接使用しない理由は、エクスプローラーとプロパティ インスペクターが、すべての元に戻す/やり直し機能、検証コードなどと共に、他の領域で再利用されることを意図しているためです。

4

2 に答える 2

0

MVVM フレームワークの使用を強くお勧めします。同様の要件があり、Tony Sneed の Simple MVVM Toolkitを採用することにしました。それは非常に軽量で、非常によく文書化されており、理解しやすく、非常に便利な機能を提供し、基本的に MVVM の配管を行う必要があります。

この場合に必要なのは、メッセージ バス機能を利用することです。

"メッセージバス

アプリケーションのビューモデル間でメッセージを渡す必要がある場合があります。良い例は、何らかのビジネス ロジックに基づいて特定のビューに移動する場合です。メイン ビュー モデルを別のビュー モデルから直接参照することはお勧めできません。これを行うと、維持が困難なビュー モデル間に相互依存関係が作成されます (スパゲッティ コードと呼ばれる現象)。ここで、メッセージ バス (イベント メディエーターまたはアグリゲーターとも呼ばれます) が役立ちます。たとえば、CustomerViewModel は、特定のトークンを使用してメッセージ バスにメッセージを送信できます。MainPageViewModel は、誰かがこの同じトークンを使用してメッセージ バスにメッセージを送信するたびに、メッセージを受信するようにサブスクライブできます。メッセージ トークンは、クラスで定数として定義できる単純な文字列です。"プログラミングリファレンスページから

それに加えて、@eran otzap が提案したように、 Josh SmithRelayCommandを使用して通知を簡素化しましたICommand

于 2013-04-08T19:48:23.347 に答える