【问题标题】:Clean viewmodel from memory when their associated pages are removed from backstack - WP8.1从后台堆栈中删除相关页面时从内存中清除视图模型 - WP8.1
【发布时间】:2015-03-01 09:31:13
【问题描述】:

在我的应用程序中,有几个页面说 - A、B、C 与它们各自的 ViewModel 相关联 - VMA、VMB、VMC。当用户到达页面 C 时,我想从 backstack 中删除页面 B,并从 ViewmodelLocator 的容器中删除其 ViewModel (VMB)。

结果应该是 b A->C

我是 MVVM light 的新手。有什么方法可以实现吗?

更新

我可以通过设置框架的导航状态从后台删除页面。如何删除视图模型引用以防止内存泄漏?

【问题讨论】:

    标签: c# mvvm navigation windows-phone-8.1 mvvm-light


    【解决方案1】:

    SimpleIoc 提供了一个 Unregister(TClass instance) 重载,用于移除一个实例。

    您可以在页面的终结器中使用它,但如果 VM 用于其他页面或有多个实例,则必须检查副作用。

    顾名思义,simpleIoc 非常简单,不提供自动方式。

    【讨论】:

    • 我在某处读到 Messenger 使用了 WeakReference。您能否指出任何可以验证 mvvm light 中的 SimpleIoc 也使用弱引用的文档。我有义务。谢谢。
    • 我只是仔细检查了一遍,你是对的:实例被永久保存。您必须使用 unregister 方法来删​​除它们。我更新了答案。
    • WP8 曾经有一个函数 OnRemovedFromJournal 在页面被销毁时触发。在 Wp8.1 中不存在这样的东西。何时调用 UnRegister 函数很难管理。我不想取消注册 OnNavigatedFrom,因为当我从 B->C 导航或从 C->B 返回时会触发它。有什么线索吗?
    • 我认为 MVVM light 的 ViewModelLocator 将管理其他页面上的 VM。同样将确保没有多个实例。感谢您的帮助:)
    【解决方案2】:

    现在我正在跟踪流程并将它们从 ViewModelLocator 中删除。这是我在两个实例上做的

    1) 当用户从当前页面返回时 2)当用户导航到页面 B 时,此页面 A 将从历史记录中清除。我从 ViewModelLocator 的容器中移除 A 的视图模型并调用它的清理以清除其资源。

    我以后会重新审视这个并尝试使用更新的 mvvm 灯光库。如果有人找到更好的方法,请提出建议。

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2021-01-14
      • 1970-01-01
      • 2019-03-20
      • 2012-12-16
      • 2021-10-29
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      相关资源
      最近更新 更多