0

私はまだ MVVM を使い始めており、すべての MSDN Prism の例を読んでいますが、Prism の概念を理解し、学んだことを強化するのに役立つと思われる次の設計上の問題に関するガイダンスが必要です。

マルチウィンドウ アプリケーションを使用しています。各ウィンドウにはフィルター ドロップダウン コントロールがあります。このフィルター コントロールの値は、同じウィンドウ内の他のコントロール (グリッド、チャートなど) の表示に影響します。

特定の操作 (グリッドの行をダブルクリックするなど) は、別のウィンドウを生成します。このウィンドウには、独自の個別のフィルター コントロールがあり、そのウィンドウ内の他のコントロールの表示のみに同様に影響します。

他のユーザー コントロールの表示を駆動するフィルターのこの動作を実装するにはどうすればよいでしょうか。これらの相互作用を疎結合に保つにはどうすればよいですか?

EventAggregator を使用し、選択が変更されたときにフィルター コントロールが更新イベントを発行する必要があると考えていますか? 私はこれについて正しい方法で考えていますか?各ウィンドウには個別の EventAggregator が必要ですか?

4

3 に答える 3

2

はい、あなたはこれについて正しい方法で考えています。EventAggregator は、実行している作業に適したツールです。イベントを発生させる予定のすべてのウィンドウに EventAggregator が必要です。EA をコンストラクターに挿入するか、ServiceLocator を使用できます。以下に 2 つの例を示します。

// Ctor injection
private IEventAggregator _eventAggregator;
public ViewModelBase(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}

// Service Locator
 ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<YourEvent>().Publish();

ここで、EA が発行する CompositePresentationEvent を作成する必要があります。CPE にペイロードを含めることで、作成されるこれらの数を最小限に抑えることができます。このようなもの:

public class NavigationSelectedEvent : CompositePresentationEvent<NavigationEnum.Destination>{}

これで、イベントを発行する準備が整いました。

 _eventAggregator.GetEvent<NavigationSelectedEvent>().Publish(NavigationEnum.Destination.Home);

次に、リソースを無駄にしないように、ペイロードにオプションのフィルターを使用してサブスクライブします。

this.EventAggregator.GetEvent<NavigationSelectedEvent>().Subscribe(HandleNavigationEvent, ThreadOption.UIThread, false, i => i == NavigationEnum.Destination.Home);
于 2012-11-02T17:25:37.617 に答える
2

を使用してフィルター通知を公開する必要がありEventAggregatorます。これが私の経験から言えば、これが最善の方法です。EventAggregatorサブスクライブしているすべてのオブジェクト間のハブとして機能するために、1 つだけを使用する必要があります。

何かのようなもの:

MyNotificationChangedArgs args = new MyNotificationChangedArgs();
args.Payload = GetThePayload(someParameters);
myEventAggregator.GetEvent<NotificationFilterChangedEvent>().Publish(args);

本当に役立つもう 1 つのことはEventAggregator、たとえば を介してに依存性を注入することUnityです。このようにして、メソッドEventAggregatorを呼び出すことで、すべてのコントロールがコモンに簡単にアクセスできます。UnityContainer.Resolve

var myEventAggregator = myUnityContainer.Resolve<MyEventAggregator>();
于 2012-11-02T16:10:05.230 に答える
1

すべてのビューは、ViewModel を介してモデルにアクセスできます。フィルターをモデル化します。次に、Views は、フィルターを使用する ViewModel 表現にバインドします。ビューはお互いを知る必要はありません。モデルにバインドする必要があるだけです。

于 2012-11-02T16:03:59.433 に答える