当ActivateItem函数被调用时,CaliburnMicro StackOverflowException



我有两个虚拟机-视图(从屏幕继承)和编辑(从屏幕继承)。视图用于显示网格的数据和编辑-添加/编辑新项目到网格。

在我的ShellViewModel我有以下代码来激活视图。

    public void WorkstationView()
    {
        this.ActivateItem(ServiceLocator.Current.GetInstance<WorkstationViewModel>());
    }

在WorkstationViewModel中,当用户单击Create按钮时,调用以下代码

    public void CreateAction()
    {
        EditableObject = new WorkstationDto();
        TryClose(true);
    }

并且有一个监听器去激活事件属性,见下面的代码(InitViewModels在ShellViewModel构造函数中调用)。

    private void InitViewModels()
    {
        #region Init
        WorkstationViewModel = ServiceLocator.Current.GetInstance<WorkstationViewModel>();
        WorkstationEditViewModel = ServiceLocator.Current.GetInstance<WorkstationEditViewModel>();
        #endregion
        #region Logic
        WorkstationViewModel.Deactivated += (o, args) => 
        {
            if (WorkstationViewModel.EditableObject == null)
            {
                return;
            }
            WorkstationEditViewModel.EditableObject = WorkstationViewModel.EditableObject;
            ActivateItem(WorkstationEditViewModel);
        };
        #endregion
    }

这里的问题是一个StackOverflow异常当我关闭编辑视图(见创建操作)。

"由于导体不维护"屏幕集合",因此每个新项的激活将导致先前活动项的停用和关闭。"这份原稿。微文档

如果您正在使用Conductor<T>,那么Deactivated处理程序中的ActivateItem(WorkstationEditViewModel);将隐式地重新触发前一个视图模型的停用-给您一个无限循环。尝试将您的导体改为继承Conductor<IScreen>.Collection.OneActive。但是,您仍然会有两次停用:一次来自原始的TryClose操作,另一次是在激活新屏幕时。重写DetermineNextItemToActivate可以帮助您避免这种情况。

相关内容

  • 没有找到相关文章

最新更新