Могу ли я реализовать свой собственный сервис разрешения вида и попросить RequestNavigate использовать его?

Я достаточно новичок в Prism и в настоящее время переписываю одно из наших существующих приложений, используя Prism в качестве доказательства концептуального проекта.

Приложение использует MVVM с первым подходом ViewModel: наша ViewModel разрешается контейнером, и сервис IViewResolver выясняет, к какому виду он должен быть подключен (используя, помимо прочего, соглашения об именах).

Код (для добавления вида в управление табуляцией) в данный момент выглядит примерно так:

var vm = (get ViewModel from somewhere)
IRegion reg = _regionManager.Regions["MainRegion"];
var vw = _viewResolver.FromViewModel(vm); // Spins up a view and sets its DataContext
reg.Add(vw);
reg.Activate(vw);

Все работает отлично, однако я бы очень хотел использовать навигационную систему Prism, чтобы сделать все это за меня, чтобы я мог сделать что-то подобное:

_regionManager.RequestNavigate(
    "MainRegion", 
    new Uri("NameOfMyViewModel", UriKind.Relative)
);

и заставить Prism развернуть ViewModel + View, настроить DataContext и вставить вид в регион.

Я 'добился некоторого успеха, создав DataTemplates, ссылающиеся на типы ViewModel, например:






...и попросил модуль добавить соответствующий словарь ресурсов в ресурсы приложения при инициализации модуля, но это кажется немного чепухой.

Есть ли способ эффективно взять на себя создание вида из Prism, чтобы при вызове RequestNavigate я мог посмотреть на поставляемый Uri и на его основе раскрутить вид/видо-модель? Существует перегрузка RegionManager.RegisterViewWithRegion, которая принимает делегата, который позволяет вам предоставить вид самостоятельно, и я думаю, что мне нужно что-то вроде этого.

Я думаю, что мне может понадобиться поставить свою собственную IRegionBehaviorFactory, но я не уверен в том, что с этим связано (или даже если я на правильном пути!).

Любая помощь оценена!

-- примечание: Первоначально размещено по адресу сайт

5
задан Jon 12 December 2012 в 12:45
поделиться