我遇到了一个奇怪的问题,我几乎是绞尽脑汁想解决它。
我有一个导体,它激活和停用用于编辑数据的视图模型,这些视图模型实现了screen,并使用OnDeactivate来确保在关闭之前保存任何更改。
然而,由于某种原因,OnDeactivate在我的一个ViewModels从来没有被调用,即使我可以看到它被传递给导体的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项目被调用,并且我可以看到它将正确的视图模型传递给该方法。
然而OnDeactivate仍然从未调用,我不知道为什么:/
protected override void OnDeactivate(bool close)
{
System.Windows.Forms.MessageBox.Show("SAVE ME!");
}
编辑以删除不正确的代码(基础代码)。这是一个错误,这是我的实际代码)
编辑:我刚刚意识到工作版本和坏版本之间的区别。我有一个视图/视图模型作为一个导体,这工作得很好。然而,在那个视图模型中,我加载了第二个视图/视图模型,它也可以作为导体,这个不起作用,我想知道它是否与另一个导体内部有关(但实际上不是由导体处理的,只是加载到那个视图模型中)
要使屏幕生命周期正常工作,必须执行视图层次结构中的所有视图模型。您应该使您的子指挥成为您的父指挥的活动屏幕。
您可以通过使其成为父导体的活动项来做到这一点,或者通过在子导体上使用ConductWith
方法来传递对父导体的引用来做到这一点。