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

11
我想做的是在ViewModel不再需要时取消订阅事件。我尝试过实现IDisposable,但Xamarin.Forms和Prism.Forms都没有调用Dispose()。
我们使用Xamarin.Forms创建应用程序,使用Prism.Forms进行MVVM。当导航到新页面(推入堆栈)时,Prism.Forms会将ViewModel与页面绑定。当从堆栈中弹出时,ViewModel在一段时间后被垃圾回收。
然而问题在于,在某个时间点,我们有几个相同类型的ViewModel订阅了未绑定到View的事件。当事件触发时,所有这些ViewModel都开始执行它们的任务。因此,我正在寻找一种在订阅不再需要时取消订阅的方法。
是否有人有解决方案?
2个回答

7

如果您想确保ViewModel不再存在于内存中,则可以在View的OnDisappearing()事件中调用Dispose()方法。

如果您只关心事件的订阅和取消订阅,最好在OnAppearing()OnDisappearing()中执行此操作。在这种情况下,一旦视图不可见,您就可以确保没有事件处理程序存在于ViewModel上。


2
谢谢,我会尝试的。请注意,当调用像拨号屏幕(在Android上)这样的意图时,Disappearing()也会被触发。因此,我将不得不再次订阅Appearing()中的事件。 - Jacco Dieleman
5
不要这样做。"Disappearing" 可以在多个地方被称为,例如当将新页面推送到当前页面之上时。 - Softlion

4

实现 IDestructibleINavigationAware

(或者像 Prism 的 BaseViewModel 示例中一样,两者都实现)


根据对象的生命周期:

  • 将您的销毁代码实现在IDestructible接口的Destroy方法中。
  • 将您的消失/出现代码实现在INavigationAware接口的OnNavigatedFrom/OnNavigatedTo方法中。

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

注意:
虽然使用上述的OnAppearing/OnDisappearing解决方案是可行的,但它暗示了 ViewModel 在管理其生命周期时依赖于来自 View 的调用(不够干净)。此外,这些方法在 ContentView 上不存在。


在 Prism 中弹出非模态页面时,实现 IDestructible 接口无效。不确定这是否是一个 bug 或其他问题。 - ErnestJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接