Prism - ViewModel-First, API-интерфейс навигации, с областями видимости
Нашел несколько примеров, которые пытались соединить функциональность области области действия с API навигации Prism, но я не совсем понимаю, как я могу соединить это, используя подход viewmodel-first с неявными шаблонами данных - каждый из которых оборачивает UserControl.
Некоторые из моих пользовательских элементов управления заключены в несколько шаблонов данных. Эти UserControls определяют свои собственные регионы.
Мой главный недостаток - неспособность понять, как можно получить ссылку на Local RegionManager во время запроса навигации. Как я могу уведомить Prism о создании области области действия, если это необходимо, и импортировать локальный экземпляр RegionManager в конструктор дочерней модели представления, которая инициирует запрос навигации?
Любая помощь?
1 ответ
Исходя из моего понимания, навигация с ScopedRegions не будет прямой особенностью Prism. Однако есть несколько обходных путей, чтобы сделать это довольно простым способом.
Вы можете посмотреть следующий пост и ветку обсуждения для обработки ScopeRegionManager через Navigation:
По сути, предложением Агустина Адами было бы получить область RegionManager из метода Region.Add() через NavigationResult, переданный в обратном вызове навигации из метода RequestNavigate().
Тогда навигационный вызов будет выглядеть следующим образом:
this.regionManager.RequestNavigate( "MainRegion",
new Uri("HelloWorldView?createRegionManagerScope=true", UriKind.Relative),
(result) =>
{
var myRegionManager = result.ExtractRegionManager();
myRegionManager.RequestNavigate("NestedRegion", new Uri("View1", UriKind.Relative));
});
ОБНОВИТЬ:
Одним из возможных подходов для установки области RegionManager в дочернюю ViewModel было бы использование Shared Service и получение оттуда RegionManager области.
Main ViewModel будет хранить RegionManager следующим образом:
...
bool createRegionManagerScope = true;
var scopedRegionManager = region.Add(view, null, createRegionManagerScope);
var dictionary = ServiceLocator.Current.GetInstance<ScopedRegionManagersSharedDictionary>();
dictionary[Names.ScopedRegionManagerName] = scopedRegionManager;
this.regionManager.RequestNavigate( Names.MainRegion,
new Uri("HelloWorldView", UriKind.Relative));
И затем дочерний ViewModel должен реализовать INavigationAware, чтобы получить и установить область RegionManager в методе OnNavigatedTo(), как показано ниже:
void OnNavigatedTo(NavigationContext navigationContext)
{
var dictionary = ServiceLocator.Current.GetInstance<ScopedRegionManagersSharedDictionary>();
this.regionManager = dictionary[Names.ScopedRegionManagerName];
...
}
Я надеюсь, что это помогает, С уважением.