如何请求使用Unity IoC在Prism 4中的视图之间进行导航

时间:2013-08-09 17:03:39

标签: c# wpf navigation unity-container prism

我正在使用Prism和Unity开发一个WPF试点项目,我的应用程序有3个模块。

模块A有2个视图,模块B有1个视图,模块C有1个视图(基本上是一个主菜单),我有我的shell。 shell有3个区域,ribbonRegion,leftRegion,rightRegion。

现在模块C的视图被加载到shell leftRegion中,它可以选择运行其他模块。当您选择任务时(这是当前唯一的选项)模块A view1也在左侧区域中导航(替换主菜单视图),而模块B视图1也在右侧区域中导航。

模块一个view1有一个按钮,可以在leftRegion中导航模块A view2并可以返回。

当我不了解LifetimeManagers时,这一切都很有效,我可以在A的view1和view2之间来回翻转,同时总是显示B的view1,我的菜单也有效。但是后来我意识到每次导航到视图时都会解析A的view1和view2的新实例。这是有问题的,因为新的ViewModel是在每个新视图被解析的情况下创建的,但后来我开始了解LifetimeManagers,所以我从瞬态变为受控。但后来我的航行断了。

ModuleA定义:( B和C的方法相同)

     container.RegisterType<Object, View1>(ViewNames.View1, new ContainerControlledLifetimeManager());
     container.RegisterType<Object, View2>(ViewNames.View2, new ContainerControlledLifetimeManager());

从主菜单导航:

    regionManager.RequestNavigate(RegionNames.RightRegion, ViewNames.TifView);
    regionManager.RequestNavigate(RegionNames.LeftRegion, ViewNames.View1);

这两个功能正如您所期望的那样,这两个模块的视图被解析并导航到,View1取代了主菜单视图。当我现在尝试从View1中的命令导航到View2时,导航中断。

    regionManager.RequestNavigate(RegionNames.LeftRegion, ViewNames.View2);

此RequestNavigate不起作用。视图未解析并添加到区域,因此导航不会发生。 (该命令可以正常工作并正常启动)

为什么View2中的View1已解析并在View2未添加到区域时添加到该区域?两个视图都以相同的方式注册和导航。实际上我可以更改顺序并首先导航到View2,然后尝试View1秒,View2将解析,但View1会被破坏。 ContainerControlledLifetimeManager中有一些我不知道的限制吗?

了解如何处理此导航的任何帮助都会有所帮助,我真的陷入了寻找源代码的地方,是LifetimeManager更改引入的问题,还是我正在注册或导航错误?< / p>

2 个答案:

答案 0 :(得分:1)

视图模型是应该具有生命周期管理器的类型,而不是视图。

container.RegisterType<ViewModel1>(new ContainerControlledLifetimeManager());

或者是否有VM的接口

container.RegisterType<IViewModel1, ViewModel1>(new ContainerControlledLifetimeManager());

您可以做的另一个选择是实现INavigationAware并在OnNavigatedTo和OnNavigatedFrom方法中处理存储/恢复所需的内容。

答案 1 :(得分:0)

有类似的问题。对我来说,这是一个例外,发生在&#34; OnNavigatedFrom&#34;其中一个视图模型的方法。棱镜框架显然捕获了异常,但导航请求仍然失败。

所以问题不在于您要求导航到的View(Viewmodel),而是您要导航的视图(viewmodel)。这就是为什么,如果你改变了导航顺序,破碎的相信视图会再次起作用。

因此,下次遇到类似问题时,打开第一次机会异常也许是一个好主意。