【发布时间】:2014-06-26 15:04:54
【问题描述】:
我遇到了一个奇怪的问题,我想尽办法解决它。
我有一个 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 项目,并且我可以看到它将正确的视图模型传递给该方法。
然而 OnDeactivate 仍然没有被调用,我不知道为什么:/
protected override void OnDeactivate(bool close)
{
System.Windows.Forms.MessageBox.Show("SAVE ME!");
}
编辑删除不正确的代码(基础。是一个错误,这是我的实际代码)
编辑:
我刚刚意识到工作版本和损坏版本之间的区别是什么。我有一个用作导体的视图/视图模型,这很好用。但是,在该视图模型中,我加载了第二个视图/视图模型,该视图/视图模型也可用作导体,这个无法工作,我想知道它是否与在另一个导体内部有关(但实际上并未由该导体处理,只是加载到该导体中视图模型)
【问题讨论】:
-
请展示您的 Conductor 类的声明,我对您如何从 Conductor 基类继承感兴趣。
-
我只是这样继承: public class ProjectPanelViewModel : Conductor
-
所以它不是 Conductor
.OneActive() ,覆盖 Deactivate 并查看是否到达断点。 -
抱歉回复晚了。正如您在上面看到的,我已经覆盖了 DeactivateItem,是的,如前所述,断点被击中,我可以看到该对象已传递给 base.ondeactivate。但是永远不会调用对象 OnDeactivated,这是我的问题
-
如果已达到,那么未停用是什么意思?在某个特定的 ViewModel 是 ActiveItem 上,您调用 Deactivate 并且没有达到 Brakepoint ?
标签: c# wpf mvvm caliburn.micro