Я довольно новичок в 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,например:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Module01">
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestView />
</DataTemplate>
</ResourceDictionary>
... и заставить модуль добавить соответствующий словарь ресурсов в ресурсы приложений при инициализации модуля, ноэто выглядит немного глупо.
Есть ли способ эффективно взять на себя создание представления из Prism, так что, когда вызывается RequestNavigate
, я могу посмотреть на предоставленный Uri
и раскрутить представление / модель представления на основена что?Есть перегрузка RegionManager.RegisterViewWithRegion
, которая принимает делегата, который позволяет вам самим создавать представление, и я предполагаю, что мне нужно что-то подобное.
Я думаю, что мне может потребоваться предоставить свой собственный IRegionBehaviorFactory
,но я не уверен, в чем дело (или даже если я на правильном пути!).
Любая помощь приветствуется!
- примечание: Первоначально опубликовано на сайте кодового комплекса призмы