.net 取消订阅事件处理程序的策略

.net 取消订阅事件处理程序的策略,.net,wpf,event-handling,.net,Wpf,Event Handling,在我的WPF应用程序中,我有一个给定了ViewModel的视图,当给定该视图时,它会将事件处理程序添加到ViewModel的PropertyChanged事件中。当GUI中发生某些操作时,我将删除该视图,并将另一个视图添加到保留容器中,在该容器中,这个新视图绑定到同一个ViewModel 发生这种情况后,旧视图仍在处理ViewModel中的PropertyChanged事件。我假设发生这种情况是因为垃圾收集器尚未收集该视图,因此该视图是活动的?我需要它停下来。我的假设是,我需要手动从ViewMo

在我的WPF应用程序中,我有一个给定了ViewModel的视图,当给定该视图时,它会将事件处理程序添加到ViewModel的PropertyChanged事件中。当GUI中发生某些操作时,我将删除该视图,并将另一个视图添加到保留容器中,在该容器中,这个新视图绑定到同一个ViewModel


发生这种情况后,旧视图仍在处理ViewModel中的PropertyChanged事件。我假设发生这种情况是因为垃圾收集器尚未收集该视图,因此该视图是活动的?我需要它停下来。我的假设是,我需要手动从ViewModel中分离事件处理程序?关于如何处理这一问题,是否有最佳实践

我使用的策略是使视图实现IDisposable,并使视图的Dispose功能取消订阅事件处理程序。然后,负责添加视图的人需要首先对旧视图调用
Dispose()


就像一个符咒,但这是IDisposable的有效使用吗

我使用的策略是使视图实现IDisposable,并使视图的Dispose功能取消订阅事件处理程序。然后,负责添加视图的人需要首先对旧视图调用
Dispose()


就像一个符咒,但这是IDisposable的有效使用吗

订阅视图的卸载事件并在卸载的事件处理程序中分离可能会更干净一些,它也不需要用户调用Dispose()

订阅视图的卸载事件并在卸载的事件处理程序中分离可能会更干净一些,它也不需要用户调用Dispose()

谢谢!与Dispose解决方案相比,我更喜欢这个解决方案。来自MSDN:“由于用户发起的系统主题更改,控件上可能会同时引发加载和卸载”。此外,如果您决定拆下图元并再次附着它,该怎么办?您是否记得重新配置事件?谢谢!与Dispose解决方案相比,我更喜欢这个解决方案。来自MSDN:“由于用户发起的系统主题更改,控件上可能会同时引发加载和卸载”。此外,如果您决定拆下图元并再次附着它,该怎么办?您是否记得重新配置事件?