我想要做的是取消订阅不再需要ViewModel时的事件。我尝试实现IDisposable,但没有人调用Dispose(),而不是Xamarin.Forms和Prism.Forms。
我们有一个用Xamarin.Forms创建的应用程序。我们使用Prism.Forms来做MVVM。导航到新页面时(推送堆栈)Prism.Forms将ViewModel连接到页面。当导航回来(从堆栈弹出)时,ViewModel会在一段时间后获得GarbageCollected。
然而问题是,在某个时间点,我们有几个相同类型的ViewModel,它们订阅了未绑定到View的事件。当事件触发所有这些ViewModel开始做他们的事情。所以我正在寻找一种在不再需要订阅时取消订阅的方法。
有没有人有解决方案?
答案 0 :(得分:6)
如果要确保内存中的ViewModel不再存在,则可以确保在View的Dispose()
事件中调用OnDisappearing()
。
如果您只关心事件的订阅和取消订阅,那么最好在OnAppearing()
和OnDisappearing()
中进行。在这种情况下,一旦视图不可见,您将确保viewmodel上没有事件处理程序。
答案 1 :(得分:3)
IDestructible
或INavigationAware
BaseViewModel
示例)。
取决于您的对象生命周期:
Destroy
界面的 IDestructible
方法中实施您的处置代码。OnNavigatedFrom
/ OnNavigatedTo
中执行消失 / 出现代码 INavigationAware
界面上的方法。 奖金:
IDestructible
也可以由 View 实现(当视图被破坏时, Prism 会相应地调用它)。>
注意:
尽管上面使用OnAppearing
/ OnDisappearing
的解决方案有效,但它会导致ViewModel依赖于View的调用来管理其生命周期(不干净)。而且这些方法在ContentView
上不存在。