如何在使用Xamarin.Forms弹出页面后处理ViewModel?

时间:2016-08-24 15:07:10

标签: mvvm xamarin.forms prism

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

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

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

有没有人有解决方案?

2 个答案:

答案 0 :(得分:6)

如果要确保内存中的ViewModel不再存在,则可以确保在View的Dispose()事件中调用OnDisappearing()

如果您只关心事件的订阅和取消订阅,那么最好在OnAppearing()OnDisappearing()中进行。在这种情况下,一旦视图不可见,您将确保viewmodel上没有事件处理程序。

答案 1 :(得分:3)

实施IDestructibleINavigationAware

(或两者均来自Prism的BaseViewModel示例)。


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

  • Destroy 界面的 IDestructible 方法中实施您的处置代码。
  • OnNavigatedFrom / OnNavigatedTo 中执行消失 / 出现代码 INavigationAware 界面上的方法。

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

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