質問

WPFアプリケーションで作業しており、Model-View-ViewModelパターンを使用しています。

現在、アプリケーションは2つのモジュールで構成されています:

  • 左パネルでツリーを参照し、ノードを選択
  • 選択したツリーノードのコンテンツを表示するメインパネル。

これら2つのモジュールを分離したままにしますが、左パネルでノードを選択するとき、メインパネルがサブスクライブできるイベントを発生させる必要があります。左パネルとメインパネルを結合したくないので、ViewModelクラスのインスタンスを共有したくありません。

Prism(WPF複合アプリケーションガイダンス)を使用したいのですが、現在は既存のアプリケーションを拡張しているため、これ以上の依存関係を導入することはできません。プロジェクトは.NET 3.0(3.5ではなく)にもあるため、.NET 3.5向けに記述されているように、Prismを.NET 3.0に戻す必要があります。

Prismでは、疎結合イベントインフラストラクチャを使用してこれを解決します。これにより、任意のレイヤーの任意のクラスでイベントを発生させ、任意のレイヤーの任意のクラスのイベントをリッスンできます。基本的に、イベントの発行者と購読者は分離されています。

コマンドを使用して、ビューとViewModel間のこの疎結合を実現していますが、適切なクロスビュー通信を行う方法がわかりません。

ヒントや提案は大歓迎です。

.NET 2.0 / 3.0(LINQを使用しない)向けの軽量計量pub / subイベントモデル、またはクロスビューを実装するためのその他のものを具体的に探しています(モジュール)2つのモジュールを結合しない通信。

更新:最終的にグレンが提案したのと同様の方法でこれを解決しました。私は別のEventServiceを持ち(CommandProxyと呼びます)、それをサービスロケーターのコンストラクターを介してすべてのViewModelに渡します(現時点では、IoCコンテナーの代わりにサービスロケーターを使用しています)。 CommandProxyは、Prism(複合WPFガイダンス)のDelegateCommandの拡張であるMultiDelegateCommantsのセットを公開します。基本的に、ビジュアルツリーから切り離され、複数のサブスクライバーをサポートするコマンドを許可します。

役に立ちましたか?

解決

IoCコンテナはありますか? 1つの簡単なアプローチは、イベントを発生させるカスタムサービスを作成することです。 Event Aggregatorは汎用ですが、必要なことを行う特定のサービスを作成できます。

たとえば、OnNodeSelectedメソッドを持つEventingServiceを作成します。このメソッドは、サービスを停止するNodeSelectedイベントを起動します。その後、サービスはIoCコンテナーに登録され、パブリッシャーとサブスクライバーがサービスにアクセスできるようになります。このように、MainPanelがサブスクライブする必要がある場合、MainPanelViewModelにはコンストラクターでEventingServiecが注入されます。その後、サブスクライブします。 WPFを使用している場合の別のアプローチは、CompositeCommandをComposite App Libraryコードからプルし、イベントサービスにCompositeCommandを公開させることです。次に、各サブスクライバー(ビューモデル)は、コマンドをサービスに登録します。 OnNodeSelectedが呼び出されると、CompositeCommandの実行が呼び出され、すべての関係者に通知されます。

このための独自のサービスの使用については、www.microsoft.com / compositewpfのComposite App Guidanceのドキュメントの「通信」トピックの「疎結合イベント」セクションで説明しています。 ( http://msdn.microsoft.com/en-us/library/cc707836 .aspx )。フランシス・チャンもこれに関する投稿をしています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top