Я создаю демонстрацию Prism 2.1, чтобы освоить эту технологию. У меня проблема с CompositePresentationEvents, опубликованным и подписанным через службу агрегации событий. Подписка на события работает нормально, если я установил строгую ссылку (KeepSubscriberReferenceAlive = true), но не удалось, если я установил слабую ссылку (KeepSubscriberReferenceAlive опущен).
Я хотел бы подписаться со слабой ссылкой, чтобы мне не пришлось управлять отменой подписки на событие. Есть ли способ сделать это? Почему здесь нужна сильная ссылка? Спасибо за вашу помощь!
Вот подробности: Моё демонстрационное приложение является однопоточным и имеет две области: Navigator и Workspace и три модуля, NavigatorModule, WorkspaceAModule и WorkspaceBModule. Модуль NavigatorModule имеет две кнопки: «Показать рабочее пространство A» и «Показать рабочее пространство B». Когда нажимается одна из этих кнопок, вызывается ICommand, которая публикует CompositePresentationEvent с именем ViewRequested. Событие несет строку полезной нагрузки, которая указывает, какой модуль рабочей области должен быть показан.
Вот объявление события из проекта инфраструктуры приложения:
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);
Вот код подписки на событие, который каждый модуль Workspace включает в свой метод Initialize ():
// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);
Оператор Subscribe () показан со строгой ссылкой.
Еще раз спасибо за вашу помощь.