4

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

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

WizardView包含一个面包屑路径以显示向导的进度和一个子区域以将其他视图加载到其中(称为 this WizardRegion)。Step1View是加载到的第一个视图WizardRegion

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

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

随着每个步骤的完成,视图模型会发布一个WizardViewModel用于存储状态的事件,这意味着WizardViewModel随着我们的进行收集来自每个步骤的数据。步骤 ViewModel 还调用控制器将下一步加载到WizardRegion.

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

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

如何让我的视图模型知道它们已停用,以便我可以取消订阅我的事件?

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

4

2 回答 2

6

解决方案是Microsoft.Practices.Prism.IActiveAware在我的视图模型中实现。

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

public event EventHandler IsActiveChanged;

也可以在视图中实现这一点,但这不是必需的。

于 2013-02-19T14:12:30.513 回答
0

如果您在谈论 Prism EventAggregator - 您可以将keepSubscriberReferenceAlive参数设置为,false以便它在后台使用弱引用,因此当对象“死亡”时,GC 会自动“取消订阅”所有内容。

fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, true);

否则,您必须通过明确退订自己来完成:

fundAddedEvent.Unsubscribe(FundAddedEventHandler);
于 2013-02-15T12:38:37.123 回答