私は Prism 2.1 のデモを作成して、テクノロジーの速度を上げています。Event Aggregation サービスを介して発行およびサブスクライブされた CompositePresentationEvents に問題があります。イベント サブスクリプションは、強い参照 (KeepSubscriberReferenceAlive = true) を設定すると正常に動作しますが、弱い参照 (KeepSubscriberReferenceAlive を省略) を設定すると失敗します。
イベントからの購読解除を管理する必要がないように、弱参照で購読したいと思います。それを行う方法はありますか?ここで強力な参照が必要なのはなぜですか? ご協力いただきありがとうございます!
詳細は次のとおりです。私のデモ アプリはシングル スレッドで、Navigator と Workspace の 2 つの領域と、NavigatorModule、WorkspaceAModule、WorkspaceBModule の 3 つのモジュールがあります。NavigatorModule には、[ワークスペース A を表示] と [ワークスペース B を表示] の 2 つのボタンがあります。これらのボタンのいずれかがクリックされると、ViewRequested という CompositePresentationEvent を発行する ICommand が呼び出されます。このイベントは、どのワークスペース モジュールを表示するかを指定する文字列ペイロードを運びます。
アプリの Infrastructure プロジェクトからのイベント宣言は次のとおりです。
using Microsoft.Practices.Composite.Presentation.Events;
namespace Prism2Demo.Common.Events
{
public class ViewRequestedEvent : CompositePresentationEvent<string>
{
}
}
Navigator モジュールからのイベント パブリッシング コードは次のとおりです。
// Publish ViewRequestedEvent
var eventAggregator = viewModel.Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Publish(workspaceName);
以下は、各ワークスペース モジュールの Initialize() メソッドに含まれるイベント サブスクリプション コードです。
// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);
Subscribe() ステートメントは強い参照で示されています。
ご協力いただきありがとうございます。