1

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

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

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

Module A view1 也有一个导航按钮,Module A view2 在 leftRegion 中,可以返回。

当我不了解 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 不起作用。视图未解析并添加到区域,因此导航不会发生。(该命令确实有效并且可以正常触发)

为什么模块 A 中的 View1 被解析并添加到了 View2 没有的区域?两个视图都以相同的方式注册和导航到。事实上,我可以更改顺序并首先导航到 View2,然后尝试 View1,然后 View2 将解决,但随后 View1 被破坏。ContainerControlledLifetimeManager 是否有一些我不知道的限制?

了解如何处理此导航的任何帮助都会有所帮助,我真的被困在哪里寻找它的来源,是 LifetimeManager 更改引入的问题,还是我注册或导航不正确?

4

2 回答 2

1

View Model 是应该有生命周期管理器的类型,而不是 View。

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

或者如果有 VM 的接口

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

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

于 2014-01-03T16:02:42.823 回答
0

有类似的问题。对我来说,这是一个视图模型之一的“OnNavigatedFrom”方法中发生的异常。prism 框架明显捕捉到了异常,但是导航请求还是失败了。

所以问题不在于您请求导航到的视图(Viewmodel),而是您从中导航的视图(viewmodel)。这就是为什么,如果您更改导航顺序,被破坏的相信视图会再次起作用。

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

于 2016-03-13T09:18:53.257 回答