Я реализовал навигацию через свое приложение, используя элемент управления Menu, который публикует событие с помощью EventAggregator при щелчке элемента меню. Что-то вроде, как показано ниже,
this.eventAggregator.GetEvent<ViewRequestedEvent>()
.Publish(new BusinessObject.Model.MenuModel
{
Module = "Dashboard",
PresenterClass = "DashboardViewModel"
});
Большинство модулей в моем приложении являются подписчиками на это событие. Они используют фильтр для подписки только на те события, которые относятся к модулю
this.eventAggregator.GetEvent<ViewRequestedEvent>()
.Subscribe(LoadViewRequest, ThreadOption.UIThread, true, i => i.Module == "Dashboard");
Запрос на просмотр обрабатывается следующим образом:
private void LoadRequestedView(MenuModel menuItem)
{
try
{
IDashboardViewModel viewModel = this.container.Resolve(Type.GetType(menuItem.PresenterClass)) as IDashboardViewModel;
this.regionManager.Regions["ViewRegion"].Add(viewModel.View);
this.regionManager.Regions["ViewRegion"].Activate(viewModel.View);
this.eventAggregator.GetEvent<ViewNotificationEvent>().Publish(menuItem.Description);
}
catch (ResolutionFailedException) { }
}
Как вы оцениваете эту реализацию? Если вы считаете, что это отстой, помогите мне улучшить его или предложить лучшую альтернативу.
Я думаю, что у вас есть определенный недостаток в разделении проблем с этой моделью. Обычно я стараюсь держать презентацию в "Шелл". Посмотрите на этот вопрос, как я это реализую. Это упрощает и абстрагирует идею RegionManager от модулей: