在我的MVVMC应用程序中,我有一个包含多个步骤的过程,基本上是一个向导。
我的控制器解析了我的外部视图(称之为WizardView
)并将其添加到主区域。
WizardView
包含一个痕迹痕迹,用于显示向导的进度,以及一个子区域,用于加载其他视图(调用此WizardRegion
)。 Step1View
是第一个加载到WizardRegion
的视图。
每个视图都使用Unity容器将ViewModel注入到构造函数中。
WizardViewModel
订阅了由步骤视图模型发布的多个事件聚合事件。
每个步骤完成后,View Model会发布一个WizardViewModel
用于存储状态的事件,这意味着WizardViewModel
正在逐步收集每个步骤中的数据。步骤ViewModel还调用控制器将下一步加载到WizardRegion
。
在最后一步WizardViewModel
保存向导的结果,MainRegion
导航回其他屏幕。
下次进入向导时,我们会创建所有Views和ViewModel的新实例,但上一个向导中的事件订阅仍然存在。
如何让我的视图模型意识到它们已被取消激活,以便我可以取消订阅我的活动?
另一种选择是取消订阅事件处理程序中的事件。这可能会有效,但当我退回向导并需要再次重新订阅事件时会增加复杂性。
答案 0 :(得分:5)
解决方案是在我的视图模型中实现Microsoft.Practices.Prism.IActiveAware
。
public bool IsActive
{
get { return _isActive; }
set
{
if (_isActive != value)
{
_isActive = value;
DoActiveChangedWork(value);
}
}
}
public event EventHandler IsActiveChanged;
也可以在View中实现它,但这不是必需的。
答案 1 :(得分:0)
如果您正在谈论Prism EventAggregator - 您可以将keepSubscriberReferenceAlive
参数设置为false
,这样它就会在引擎盖下使用弱引用,这样当对象出现时,GC会自动“取消订阅”所有内容“死”。
fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, true);
否则你必须通过明确取消订阅来自己完成:
fundAddedEvent.Unsubscribe(FundAddedEventHandler);