4

私は 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 ガイダンス)。基本的に、ビジュアル ツリーから切り離されたコマンドを許可し、複数のサブスクライバーをサポートします。

4

1 に答える 1

7

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

たとえば、OnNodeSelected メソッドを持つ EventingService を作成します。そのメソッドは、サービスからハングアップする NodeSelected イベントを発生させます。その後、サービスは IoC コンテナーに登録され、パブリッシャーとサブスクライバーがアクセスできるようになります。このように、MainPanel をサブスクライブする必要がある場合、MainPanelViewModel のコンストラクターに EventingServiec が挿入されます。その後、サブスクライブします。WPF を使用している場合のもう 1 つの方法は、複合アプリ ライブラリ コードから CompositeCommand をプルし、イベント サービスに CompositeCommand を公開させることです。次に、各サブスクライバー (View Model) がコマンドをサービスに登録します。OnNodeSelected が呼び出されると、CompositeCommand の実行が呼び出され、すべての関係者に通知されます。

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

于 2008-10-22T17:30:35.220 に答える