2

我有一个包含多个区域的“父”视图,我将其他视图加载到其中。这些“子”视图始终相同,并且在运行时不会更改,因此它们在应用程序启动期间使用regionManager.RegisterViewWithRegion...语法注册到其区域。目前所有的视图都是单例的,我使用 Castle Windsor for IoC。

请记住,在嵌套区域中的视图模型上不会调用“INavigationAware”方法,什么是初始化和清理我的子视图的好方法?父虚拟机保存对子虚拟机的引用(注入)是“可接受的”设计吗?然后我可以从父方法中调用子虚拟机上的某种初始化/清理OnNavigatedTo()/From()方法吗?

另一种选择可能是将视图更改为瞬态,然后我可以简单地使用构造函数进行初始化,而不用担心清理(我只是在视图被重新使用和显示之前清除旧的“状态”)。唯一的潜在问题是我的应用程序使用“事件服务”(类似于 Prism 的事件代理),其中一些视图模型充当发布者,而其他视图模型充当订阅者。我担心如果我将它们设为瞬态,视图模型将不会因为事件订阅而被 GC,并且这些“死”视图将继续响应事件。它是否正确?如果是这样,我大概需要实施一种清理方式(如上所述),我可以在哪里取消订阅?

4

1 回答 1

0

我遇到了同样的问题,前一阵子。

我这样做的方法是在父 ViewModel 和那些范围区域/视图的 ViewModel 上实现 INavigationAware 接口,然后在父 ViewModel OnNavigatedFrom 方法上,调用子 ViewModel 的 OnNavigatedFrom。

请记住,您必须在父视图模型中保留对子视图模型的引用(我认为这不是一个坏习惯)。当您离开父视图时(取决于 KeepAlive 属性的值,如果您在父视图模型和子视图模型中实现了 IRegionMemberLifetime),该引用可以由容器注入并删除(拆除)。

于 2013-09-05T19:26:11.637 回答