私は WPF アプリケーションに取り組んでおり、Model-View-ViewModel パターンを使用しています。
現在、アプリケーションは 2 つのモジュールで構成されています。
- ツリーをブラウズしてノードを選択するための左パネル
- 選択したツリー ノードのコンテンツを表示するメイン パネル。
これら 2 つのモジュールを分離したままにしたいのですが、左側のパネルでノードを選択したときに、メイン パネルがサブスクライブできるイベントを発生させる必要があります。Left パネルと Main パネルを結合したくないので、ViewModel クラスのインスタンスを共有したくありません。
Prism (WPF Composite Application Guidance) を使用したいのですが、現在、既存のアプリケーションを拡張していて、これ以上依存関係を導入することはできません。このプロジェクトは (3.5 ではなく) .NET 3.0 にもあるため、Prism は .NET 3.5 用に作成されているため、.NET 3.0 に戻す必要があります。
Prism では、疎結合イベント インフラストラクチャを使用してこれを解決します。これにより、任意のレイヤーの任意のクラスでイベントを発生させ、任意のレイヤーの任意のクラスの任意のイベントをリッスンできます。基本的に、イベントのパブリッシャーとサブスクライバーは切り離されています。
コマンドを使用してビューとビューモデルの間の疎結合を実現していますが、適切なクロスビュー通信を行う方法がわかりません。
ヒントや提案は大歓迎です。
私は特に、.NET 2.0/3.0 用の非常に軽量な pub/sub イベント モデル (LINQ のものはありません)、または 2 つのモジュールを結合せずにクロス ビュー (モジュール) 通信を実装する何かを探しています。
更新:グレンが提案するのと同様の方法でこれを解決することになりました。別の EventService (私は CommandProxy と呼んでいます) を用意し、それをサービス ロケーターのコンストラクターを介してすべての ViewModel に渡します (現時点では、IoC コンテナーの代わりにサービス ロケーターを使用しています)。CommandProxy は、Prism の DelegateCommand の拡張である MultiDelegateCommants のセットを公開します (複合 WPF ガイダンス)。基本的に、ビジュアル ツリーから切り離されたコマンドを許可し、複数のサブスクライバーをサポートします。