棱镜 - ViewModel-First,导航API,带有范围区域

时间:2014-02-11 06:42:17

标签: navigation prism regions

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

我的一些UserControl包含在多个DataTemplates中。这些UserControl指定了自己的区域。

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

任何帮助?

1 个答案:

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

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