取消订阅ViewModels中的EventAggregator事件

Dir*_*aus 6 wpf prism mvvm

我开始在PRISM和MVVM上使用WPF.我面临的一个问题是,我找不到一个好的地方/最佳实践来取消订阅以前在ViewModel中订阅的EventAggregator事件.以下解决方案 - 在析构函数中调用Unsubscribe - 为时已晚.它只是运行下一个垃圾收集.

public class ViewModel : ViewModelBase
{
    public ViewModel()
    {
        var eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
        eventAggregator.GetEvent<SeriesSelectionChangedEvent>().Subscribe(OnSeriesSelectionChanged);
    }

    ~ViewModel()
    {
        var eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
        eventAggregator.GetEvent<SeriesSelectionChangedEvent>().Unsubscribe(OnSeriesSelectionChanged);
    }

    void OnSeriesSelectionChanged(SeriesSelectionChangedEventArgs e)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nov 4

由你决定!如果您的应用程序可以在不再需要时通知 ViewModel,那么您应该在那里取消订阅。

例如,在我们的项目中,我们有 IViewDisposeService。如果视图(或其模型)需要确定性终结,它会在显示时将自身注册到 IViewDisposeService 中。然后,当注册视图从区域中删除时,核心使用相同的服务来通知它们。

另一种方法是使用命令。您的模型公开命令,视图关闭时必须调用该命令。ViewModel 可以使用命令处理程序来取消订阅。

顺便说一句,如果您担心 EventAggregator 会保存您的 ViewModel,这不是问题,因为 Prism 的 EventAggregator 使用弱引用。

  • 在注册活动时,您还可以选择强有力的参考。 (2认同)