【问题标题】:Prism navigation - how to handle child view initialisation and cleanup?棱镜导航 - 如何处理子视图初始化和清理?
【发布时间】:2013-09-06 03:26:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: prism prism-4


    【解决方案1】:

    不久前我也遇到过同样的问题。

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

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

    【讨论】:

    • 谢谢,我也想过这个,但它似乎有点笨拙,想知道 Prism 是否内置了一些东西。不要猜——这个问题似乎在论坛上一遍又一遍地出现,很遗憾 Prism 开发人员没有让这类事情更容易管理。我想如果视图/虚拟机是瞬态的,这种方法将不起作用,因为你不会得到相同的实例被注入!
    • 视情况而定。如果您的父 ViewModel/View 负责获取子视图的实例并将每个视图设置为属性,则可以将其绑定为子视图的数据上下文。使用这种方法,您可以使用 KeepAlive 来管理 View 的生命周期及其各自的 ViewModel,例如,只有在从容器中获取父视图的新实例时,才会从容器中获取视图模型(由父视图模型)。无论哪种情况,我相信如果 View 是瞬态的,那么 ViewModel 也应该是瞬态的。
    • 只要你不在同一个 View 的不同实例之间共享同一个 ViewModel 实例,就可以了。
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2012-03-16
    • 2023-03-14
    相关资源
    最近更新 更多