【问题标题】:Caliburn.Micro - OnDeactivate Not triggeringCaliburn.Micro - OnDeactivate 未触发
【发布时间】: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


【解决方案1】:

要使屏幕生命周期正常运行,必须执行视图层次结构中的所有视图模型。您应该让您的子指挥成为您父指挥的活动屏幕。

您可以通过将其设置为父导体的活动项来做到这一点,或者通过在子导体上使用ConductWith 方法,传入对父导体的引用。

【讨论】:

  • 抱歉回复晚了,我好像忘记在评论上点击提交了,使用 ConductWith 完美运行,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多