棱镜导航 - 如何处理子视图初始化和清理?

时间:2013-09-04 15:36:39

标签: prism prism-4

我有一个父母"包含多个区域的视图,我加载其他视图。这些"孩子"视图始终相同且不会在运行时更改,因此在应用程序启动期间使用regionManager.RegisterViewWithRegion...语法向其区域注册。所有观点目前都是单身人士,我使用Castle Windsor作为IoC。

请记住' INavigationAware'方法不会在嵌套区域的视图模型上调用,这对于初始化和清理我的子视图有什么好方法?它是否可以接受"设计父VM以保存对子VM的引用(注入)?然后,我可以在父OnNavigatedTo()/From()方法中的子VM上调用某种init / cleanup方法?

另一种选择可能是将视图更改为瞬态,然后我可以简单地使用构造函数进行初始化,而不用担心清理(我只是为了清除旧的"状态"在视图之前重复使用和显示)。 唯一可能的问题是我的应用程序使用"事件服务" (类似于Prism的活动经纪人),一些视图模型充当发布者,其他视图模型充当订阅者。我担心如果我让它们成为瞬态的,视频模型因为事件订阅而无法获得GC,而且这些"死了"观点将继续回应事件。它是否正确?如果是这样,我是否需要实施一种清理方式(如上所述),我可以取消订阅?

1 个答案:

答案 0 :(得分:0)

我曾经遇到过同样的问题。

我这样做的方法是在Parent ViewModel和那些作用域Region / Views的ViewModels中实现INavigationAware接口,然后在Parent ViewModel OnNavigatedFrom方法上,调用子ViewModels的OnNavigatedFrom。

请记住,您必须在Parent ViewModel中保留Children ViewModel的引用(我认为这不是一个不好的做法)。当您离开父视图时,可以通过Container注入此引用并删除(Teared Down)(如果您在父视图和子视图模型中实现了IRegionMemberLifetime,则取决于KeepAlive属性的值。)