我有一位家长。我想在其中显示第一个视图模型。然后在第一个关闭之后(即完成一些操作),我想展示一个不同的视图模型。
我正在使用Caliburn.Micro.Contrib,其中 ConductResult 在指挥中显示子VM。它有一个很酷的扩展方法 AfterClosingDo ,在该子项被停用并关闭后运行一个协程。
但是,当我使用AfterClosingDo
运行另一个ConductResult时,基本上会发生这种情况:
第一个VM基本上显示了加载操作的进度,第二个VM显示了实际数据。加载完成后,我想在父Conductor中显示数据(当然使用第二个VM)。
所以,我的问题是:在Caliburn.Micro
中是否有一种干净的方法可以做到这一点,最好不要覆盖指挥,屏幕等的默认行为。
我正在考虑使用 EventAggregator ,虽然我不确定,但这是否是最佳解决方案。
答案 0 :(得分:3)
我有一个非常类似的问题,我有一个指挥打开一个子VM,然后会弹出一个确认框说“你想要关闭”并且已经开始回调原始项CanClose
方法它具有与你描述的相同的效果。
弹出VM将关闭,但在关闭时它将触发一个应该关闭第一个VM的回调。
我的指挥最终重新激活原来的VM,这很烦人。事件的顺序是:
最后我刚刚实现了一个在关闭后触发的接口。
关闭后有工作要做的子项目实现界面(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
,因为回调会触发它会在那里抛出一个空引用异常。我应用的修复似乎没有造成任何不良影响,但我还没有真正看到为什么抛出空引用异常。
我找不到任何其他方法来执行此操作,因为上一次触发的事件似乎是停用事件并且它们仍处于早期状态。