在Prism/Composite MVVM WPF应用程序中使View Models激活

Ben*_*nCr 3 wpf prism mvvm eventaggregator

在我的MVVMC应用程序中,我有一个包含多个步骤的过程,基本上是一个向导.

我的控制器解析了我的外部视图(调用它WizardView)并将其添加到主区域.

WizardView包含一个痕迹痕迹,用于显示向导的进度,以及一个子区域,用于加载其他视图(调用此方法WizardRegion).Step1View是第一个加载到的视图WizardRegion.

每个视图都使用Unity容器将ViewModel注入到构造函数中.

WizardViewModel 订阅由步骤视图模型发布的多个事件聚合事件.

当每个步骤完成后,View Model会发布一个WizardViewModel用于存储状态的事件,这意味着WizardViewModel在我们进行时从每个步骤收集数据.步骤ViewModel还调用控制器来加载下一步WizardRegion.

在最后一步WizardViewModel保存向导的结果,并MainRegion导航回其他屏幕.

下次进入向导时,我们会创建所有Views和ViewModel的新实例,但上一个向导中的事件订阅仍然存在.

如何让我的视图模型意识到它们已被取消激活,以便我可以取消订阅我的活动?

另一种选择是取消订阅事件处理程序中的事件.这可能会有效但当我退回向导并需要再次重新订阅事件时会增加复杂性.

Ben*_*nCr 5

解决方案是Microsoft.Practices.Prism.IActiveAware在我的View Model中实现.

public bool IsActive
{
    get { return _isActive; }
    set
    {
        if (_isActive != value)
        {
            _isActive = value;
            DoActiveChangedWork(value);
        }
    }
}

public event EventHandler IsActiveChanged;
Run Code Online (Sandbox Code Playgroud)

也可以在View中实现它,但这不是必需的.