我遇到了一个奇怪的问题,而且我最终想要解决这个问题。
我有一个Conductor来激活和停用用于编辑数据的视图模型,这些视图模型实现了屏幕并使用OnDeactivate来确保在关闭之前保存所有更改。
然而由于某种原因,我的一个ViewModel中的OnDeactivate永远不会被调用,即使我可以看到它被传递给指挥的DeactivateItem。
要做到这一点,我的指挥有以下几点:
private void SwitchScreen(Screen viewModel)
{
DeactivateItem(ActiveItem, true);
ActivateItem(viewModel);
NotifyOfPropertyChange(() => ProjectActionRegion);
}
public override void DeactivateItem(IScreen item, bool close)
{
base.DeactivateItem(item, close);
NotifyOfPropertyChange(() => ProjectActionRegion);
}
这可确保在调用TryClose时正确更新区域。每次在数据网格上进行选择并加载视图模型时,都会调用SwitchScreen。我可以看到当我更改选择时调用Deactivate项,我可以看到它将正确的viewmodel传递给该方法。
但OnDeactivate仍未被调用,我不明白为什么:/
protected override void OnDeactivate(bool close)
{
System.Windows.Forms.MessageBox.Show("SAVE ME!");
}
编辑删除不正确的代码(基础。这是一个错误,这是我的实际代码)
编辑:
我刚刚意识到工作版本和破碎版本之间的区别是什么。我有一个视图/ viewmodel作为指挥,这工作正常。然而,在该视图模型中,我加载了第二个视图/视图模型,它也可以作为导体使用,这个不能工作,我想知道它是否与另一个导体内部有关(但实际上并没有被那个导体处理,只是加载到那个viewmodel)
答案 0 :(得分:1)
要使屏幕生命周期正常运行,必须执行视图层次结构中的所有视图模型。您应该让您的孩子指挥您的父母指挥的活动屏幕。
您可以通过将其作为父指挥的活动项目,或者通过在子指挥上使用ConductWith
方法,传递对父指挥的引用来实现此目的。