我有两个虚拟机-视图(从屏幕继承)和编辑(从屏幕继承)。视图用于显示网格的数据和编辑-添加/编辑新项目到网格。
在我的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
可以帮助您避免这种情况。