找到了一些尝试将范围区域功能与Prism的Navigation API结合起来的示例,但我不太明白如何使用带有隐式datatemplates的viewmodel-first方法将它们放在一起 - 每个包装一个UserControl。
我的一些UserControl包含在多个DataTemplates中。这些UserControl指定了自己的区域。
我的主要缺点是,我无法掌握在导航请求期间如何获取对Local RegionManager的引用。如果需要,如何通知Prism创建作用域区域,并在启动导航请求的子ViewModel的构造函数中导入本地RegionManager实例?
任何帮助?
答案 0 :(得分:3)
根据我的理解,使用 ScopedRegions 的导航不会是 Prism 的直接功能。但是,为了以一种非常简单的方式完成它,我们发布了一些解决方法。
您可以查看以下帖子和讨论主题,以便在导航中处理 ScopeRegionManagers :
基本上,Agustin Adami的提议是通过从 Region.Add() 方法获取范围 RegionManager 。 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 的一种可能方法是使用共享服务并获取范围 RegionManager 从那里开始。
主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];
...
}
我希望这会有所帮助,问候。