我开始在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)
由你决定!如果您的应用程序可以在不再需要时通知 ViewModel,那么您应该在那里取消订阅。
例如,在我们的项目中,我们有 IViewDisposeService。如果视图(或其模型)需要确定性终结,它会在显示时将自身注册到 IViewDisposeService 中。然后,当注册视图从区域中删除时,核心使用相同的服务来通知它们。
另一种方法是使用命令。您的模型公开命令,视图关闭时必须调用该命令。ViewModel 可以使用命令处理程序来取消订阅。
顺便说一句,如果您担心 EventAggregator 会保存您的 ViewModel,这不是问题,因为 Prism 的 EventAggregator 使用弱引用。