C# Caliburn.Micro-未触发

C# Caliburn.Micro-未触发,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,我有一个奇怪的问题,我几乎无计可施地试图解决它 我有一个导体,用于激活和禁用用于编辑数据的viewmodels,这些视图模型实现屏幕,并使用OnDeactivate确保在关闭之前保存任何更改 然而,由于某些原因,我的一个ViewModel中的OnDeactivate从未被调用,即使我可以看到它被传递给导体的DeactivateItem 要执行此操作,请在我的导体中执行以下操作: private void SwitchScreen(Screen viewModel) {

我有一个奇怪的问题,我几乎无计可施地试图解决它

我有一个导体,用于激活和禁用用于编辑数据的viewmodels,这些视图模型实现屏幕,并使用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时正确更新区域。每次在datagrid上进行选择并加载viewmodel时,都会调用开关屏幕。我可以看到在我更改选择时调用了Deactivate项,并且可以看到它将正确的viewmodel传递到该方法中

但是,我仍然没有打过电话,我也不知道为什么:/

    protected override void OnDeactivate(bool close)
    {
        System.Windows.Forms.MessageBox.Show("SAVE ME!");
    }
编辑以删除不正确的代码(基。是个错误,这是我的实际代码)

编辑:


我刚刚意识到工作版本和损坏版本之间的区别。我有一个视图/视图模型,可以作为导体使用,这很好。然而,在该视图模型中,我加载了第二个视图/视图模型,该视图/视图模型也作为导体工作,但该视图/视图模型无法工作,我想知道它是否与位于另一个导体中有关(但不是由该导体实际处理,只是加载到该视图模型中)

,以便屏幕生命周期正常工作,必须执行视图层次结构中的所有视图模型。您应该使您的子导体成为父导体的活动屏幕


您可以将其设置为父导体的活动项,也可以在子导体上使用
ConductWith
方法,传入对父导体的引用。

请显示导体类的声明,我感兴趣的是如何从导体基类继承。我只是这样继承:public class ProjectPanelViewModel:Conductorso it's Not Conductor.OneActive(),重写Deactivate并查看是否到达断点。很抱歉回复太晚。正如您在上面所看到的,我已经覆盖了DeactivateItem,是的,正如前面提到的,断点被命中,我可以看到对象被传递到base.ondeactivate。然而,激活的对象从未被调用,这是我的问题。如果它已到达,那么不被激活是什么意思?在某个特定的ViewModel上,在某个点上是ActiveItem,您调用Deactivate,但未到达制动点?很抱歉,回复太晚,我似乎忘记在评论上单击submit,这在使用ConductWith时非常有效,非常感谢。