【问题标题】:How to Dispose a ViewModel after Popping a page with Xamarin.Forms?使用 Xamarin.Forms 弹出页面后如何处理 ViewModel?
【发布时间】:2016-12-31 19:23:09
【问题描述】:

我想做的是在不再需要 ViewModel 时取消订阅事件。我尝试实现 IDisposable,但没有人调用 Dispose(),而不是 Xamarin.Forms 或 Prism.Forms。

我们有一个使用 Xamarin.Forms 创建的应用。我们使用 Prism.Forms 来做 MVVM。当导航到新页面(推送堆栈)时,Prism.Forms 将 ViewModel 连接到页面。当导航回来(从堆栈中弹出)时,ViewModel 会在一段时间后得到 GarbageCollected。

然而问题在于,在某个时间点,我们有几个相同类型的 ViewModel,它们订阅了未绑定到 View 的事件。当事件触发时,所有这些 ViewModel 开始做他们的事情。因此,我正在寻找一种在不再需要订阅时取消订阅的方法。

有人有解决办法吗?

【问题讨论】:

    标签: mvvm xamarin.forms prism


    【解决方案1】:

    如果您想确保 ViewModel 不再存在于内存中而不是视图中,您可以确保在视图的 OnDisappearing() 事件中调用 Dispose()

    最好只关心订阅和取消订阅事件,然后在OnAppearing()OnDisappearing() 中进行。在这种情况下,一旦视图不可见,您将确定视图模型上不存在任何事件处理程序。

    【讨论】:

    • 谢谢,我会试试的。请注意,当调用像 Dailer 屏幕(在 Android 上)这样的意图时,也会触发 Disappearing()。所以我必须再次订阅 Appearing() 中的事件。
    • 不要那样做。消失可能会在多个地方调用,例如在当前页面上方推送新页面时。
    【解决方案2】:

    实现IDestructibleINavigationAware

    (或两者兼有,如 Prism 的 BaseViewModelsample)。


    取决于您的对象生命周期:

    • IDestructible接口的Destroy方法中实现你的disposal代码。
    • OnNavigatedFrom/OnNavigatedTo 方法中实现您的disappearing/appearing代码>INavigationAware 接口。

    奖金IDestructible 也可以由 View 实现(当视图被销毁时,Prism 会相应地调用它)。

    注意:
    虽然上面使用OnAppearing/OnDisappearing 的解决方案有效,但它导致 ViewModel 将依赖于来自 View 的调用来管理其生命周期(不干净)。而且ContentView上不存在这些方法。

    【讨论】:

    • 在 Prism 中弹出非模态页面时,实现 IDestructible 不起作用。不确定这是错误还是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2015-07-09
    • 2011-11-13
    相关资源
    最近更新 更多