我有一位家长指挥。我想显示其中的第一个视图模型。然后在第一个关闭后(即完成一些操作),我想显示一个不同的视图模型。
我在用着Caliburn.Micro.Contrib https://github.com/kmees/CMContrib,其中一个行为结果在 a 中显示子 VM导体。它有一个很酷的扩展方法关闭后执行,它在该子进程停用并关闭后运行一个协程。
但是,当我使用运行另一个 ConductResult 时AfterClosingDo
,基本上会发生这种情况:
- 第一个子 VM 已关闭
- 发生停用事件,ConductResult 运行 AfterClosing 操作
- 在 AfterClosing 中,我使用父 Conductor 中的 ConductResult 打开第二个子虚拟机
- 第二个子虚拟机已正确激活
- 但是,第一个子虚拟机的停用仍未完成,并且null项目在 Conductor 中设置为活动状态
第一个虚拟机基本上显示加载操作的进度,第二个虚拟机显示实际数据。加载完成后,我想显示父 Conductor 中的数据(当然使用第二个虚拟机)。
所以,我的问题是:有没有一种干净的方法可以做到这一点Caliburn.Micro
,最好不要覆盖 Conductor、Screen 等的默认行为。
我正在考虑使用事件聚合器,虽然我不确定这是否是最好的解决方案。
我遇到了一个非常类似的问题,我有一个指挥者打开了一个子虚拟机,然后会弹出一个确认框,提示“您想关闭吗”,并触发了原始项目的回调CanClose
方法与您描述的效果相同。
弹出虚拟机将关闭,但在关闭时它将触发一个回调,该回调应该关闭第一个虚拟机。
我的指挥最终重新激活了原来的虚拟机,这很烦人。事件的顺序是:
- 打开虚拟机1
- 尝试关闭虚拟机 1
- CanClose 保护方法被触发
- VM 1 的 CanClose 中弹出 VM 2(使用相同的导线)
- 单击虚拟机 2 上的确认按钮
- 确认按钮触发 CanClose 回调并关闭 VM1
- VM2 关闭
- Conductor 记得 VM 1 在 VM 2 之前处于活动状态,因此在 VM 1 关闭后重新打开它
最后我只是实现了一个在关闭后触发的接口。
关闭后有工作要做的子项实现该接口(IAfterClose
)
然后我提供了一个覆盖DeactivateItem
在导体上:
public override void DeactivateItem(IScreen item, bool close)
{
var afterClose = item as IAfterClose;
base.DeactivateItem(item, close);
if (afterClose != null && close)
afterClose.AfterClose();
}
这确保了回调不会过早被触发。不确定这是否会让您受益(因为我没有使用 contrib 库),但它可能会给您一些想法。
唯一的缺点是我必须修复DefaultCloseStrategy
当回调触发时,它会抛出一个空引用异常。我应用的修复似乎没有造成不良影响,但我并没有真正研究为什么抛出空引用异常。
我找不到任何其他方法来执行此操作,因为最后一个触发的事件似乎是停用事件,而且它们还为时过早。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)