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];
    ...
}

Я надеюсь, что это помогает, С уважением.

Другие вопросы по тегам