0

我有两个 VM - View(从 Screen 继承)和 Edit(从 Screen 继承)。视图用于显示带有数据的网格和编辑 - 将新项目添加/编辑到网格中。

在我的 ShellViewModel 中,我有以下代码来激活 View。

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

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

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

并且有一个 Deactivated 事件属性的侦听器,请参见下面的代码(在 ShellViewModel 构造函数中调用 InitViewModels)。

    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 异常(请参阅创建操作)。

4

1 回答 1

0

“由于指挥者不维护‘屏幕集合’,每个新项目的激活都会导致先前活动项目的停用和关闭。” Caliburn.Micro 文档

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

于 2013-12-07T21:27:50.710 回答