5

次のシナリオを考えます。

  1. ViewModelA は ViewModelB を起動します (もちろん、Ioc と DI を使用して必要な型を解決する共通のコントローラーを介して)。
  2. ViewModelB は、ViewModelA でプロパティ値を設定する必要があります。

ViewModelA をコンストラクター インジェクションで ViewModelB に単純にインジェクトし、プロパティを直接設定するだけではダメですか?

または…</p>

ViewModel 間のすべての通信を処理するために、Prism の EventAggregator のようなメッセージング システムを使用する必要がありますか?

簡単なので注入アプローチが好きですが、私の本能は何かが足りないと言っています. 私の盲点を埋めるのを助けるために、あなたの集合的な知恵を求めます.

4

4 に答える 4

2

双方向参照が必要な場合は、コードの匂いだと思います。多くの場合、参照の 1 つをイベントに置き換えることができます。

ViewModelB が ViewModelA がサブスクライブするイベントを発生させます。Prism に見られるような完全なメッセージング システムは確かにオプションですが、あなたのシナリオでは、「通常の」イベントで問題ないように思えます。

于 2011-01-26T18:34:25.957 に答える
1

この質問(および私の回答)は似ていますが、正確にあなたの問題ではないため、この質問(および私の回答)を読むことをお勧めします。親/子 ViewModel オブジェクト間のプロパティの通信を処理します。

基本的な例を見てみましょう:

  • ViewModelAは親であり、B のいくつかのプロパティの合計を提示する必要があります
  • ViewModelBは子であり、合計が必要なプロパティがあります

したがって、ユーザーは B のプロパティを編集する要求を行い、要求は成功するため、B はおそらくそのプロパティの値を変更し、PropertyChangedイベントを発生させます。

ViewModelAすべての子のイベントをサブスクライブできますが、その道をたどったので、好きではありません。子供が追加および削除されると、多くの簿記を行う必要があります。

A を B に注入する方がクリーンですが、まだ多くの簿記を行う必要があります。Aに「クリアチルドレン」アクションがある場合はどうなりますか? すべての場合において、B から A への親関係を適切に取り除くことを覚えておく必要があります。それでも、私の意見では、より明確であるため、イベントよりも優れています。

個人的には、メッセージのアイデアが好きです。私は Prism よりも MVVM Light のメッセンジャーに精通していますが、考え方は同じで、グローバル メッセージ バスです。Bはいつでも「財産を変更しました!」と言うことができます。次に、A は通知をリッスンし、計算自体を行います。これは、簿記がはるかに少ない最もクリーンなソリューションだと思います。

于 2011-01-26T17:48:59.547 に答える
0

WPF アプリケーション フレームワーク (WAF)のサンプル アプリケーションが役立つ場合があります。ViewModel はお互いを知りません。それらの間の仲介はControllersによって行われます。このようにして、ViewModel オブジェクト間の循環的な依存関係を防ぐことができます。

于 2011-01-29T19:24:28.717 に答える