WPF と PRISM を使用して WPF アプリケーションを作成しようとしています。MEF と mvvm も使用しています。イベント アグリゲータを使用して相互に通信できる 2 つのビューモデルを持つことは可能ですか? 例えば。ビューモデル A で公開し、ビューモデル B でサブスクライブしますか? もしそうなら、どのように?複数のビューモデルを使用してプログラムを構築しましたが、これらのビューモデルの一部は互いに通信する必要がありますが、イベントアグリゲーターを使用してビューモデル A で公開すると、ビューモデル B のサブスクライブが同じイベントアグリゲーターに属していると認識されないため、ビューモデル B に接続されているビューを更新します。
5 に答える
これは、Event Aggregator を定義するための基本的な重要な手順です。
(1) イベント集計の作成..
public class YourEvent: CompositePresentationEvent {
}
(2) パブリッシャー VM
eventAggregator.Get().Publish(オブジェクト);
(3) サブスクリプション VM
YourEvent eventobj = eventAggregator.Get();
if (subscriptionToken != null)
{
eventobj.Unsubscribe(subscriptionToken);
}
subscriptionToken = eventobj.Subscribe(YourEventHandler, ThreadOption.UIThread, false, yourfun);
唯一の可能性は、ViewModel "B"がロードされていないか、イベントにまだサブスクライブしていないことです。これが当てはまらない場合は、スニペットを貼り付けることをお勧めします。
EventAggregator は常に同じです。各 Viewmodel に渡す必要があります。Prism と MEF はこれを行うことができます。
PRISM の Unity を使用して、コンストラクターで EventAggregator をロードできます。
MEFでEventAggregatorの参照を注入できます
WeakReference (弱いサブスクリプション) を使用してサブスクライブしていますか? その場合、サブスクライバーが他の場所で参照されていない場合は、イベントを公開する前にガベージ コレクションが行われて消えている可能性があります。