Prism-ViewModel-First,导航API,带范围区域



找到了一些尝试将范围区域功能与Prism的Navigation API结合起来的示例,但我不太明白如何使用具有隐式数据模板的viewmodel-first方法将其结合在一起,每个方法都包装一个UserControl。

我的一些UserControls封装在多个DataTemplates中。这些UserControls指定自己的区域。

我的主要缺点是无法理解如何在导航请求期间获取对Local RegionManager的引用。如有必要,我如何通知Prism创建作用域,并在启动导航请求的子ViewModel的构造函数中导入本地RegionManager实例?

有什么帮助吗?

根据我的理解,带有ScopedRegions导航不会是Prism的直接功能。然而,为了以一种非常简单的方式完成它,发布了一些变通方法。

您可以查看以下帖子和讨论主题,了解如何在导航中处理ScopeRegistrationManagers

  • 棱镜区域导航和范围区域
  • 导航和范围区域

基本上,Agustin Adami的建议是通过RequestNavigate()方法的导航回调中传递的NavigationResult,从Region.Add()获得作用域的RegionManager

导航呼叫将如下所示:

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的一种可能方法是使用共享服务并从中获取作用域RegionManager

Main ViewModelRegionManager存储如下:

...
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,以便在OnNavigatedTo()方法上检索和设置作用域RegionManager(如下所示):

void OnNavigatedTo(NavigationContext navigationContext)
{
var dictionary = ServiceLocator.Current.GetInstance<ScopedRegionManagersSharedDictionary>();
this.regionManager = dictionary[Names.ScopedRegionManagerName];
...
}

我希望这能有所帮助,问候。

最新更新