【问题标题】:Show one child VM, then show another, after the first was closed显示一个子虚拟机,然后在第一个关闭后显示另一个
【发布时间】:2013-03-06 02:47:25
【问题描述】:

我有一位家长指挥。我想在其中显示第一个视图模型。然后在第一个关闭后(即完成一些操作),我想显示一个不同的视图模型。

我正在使用 Caliburn.Micro.Contrib,其中 ConductResultConductor 中显示子 VM。它有一个很酷的扩展方法AfterClosingDo,在那个孩子被停用和关闭后运行一个协程。

但是,当我使用 AfterClosingDo 运行另一个 ConductResult 时,基本上会发生这种情况:

  • 第一个子虚拟机 已关闭
  • 发生停用事件,ConductResult 运行 AfterClosing 操作
  • 在 AfterClosing 中,我使用父 Conductor 中的 ConductResult 打开第二个子 VM
  • 第二个子虚拟机已正确激活
  • 但是,第一个子 VM 的停用仍未完成,null 项在 Conductor 中设置为活动

第一个 VM 基本上显示加载操作的进度,第二个 VM 显示实际数据。加载完成后,我想在父 Conductor 中显示数据(当然是使用第二个 VM)。

所以,我的问题是:在Caliburn.Micro 中是否有一种干净的方法可以做到这一点,最好不要覆盖导体、屏幕等的默认行为。

我正在考虑使用 EventAggregator,但我不确定它是否是最佳解决方案。

【问题讨论】:

    标签: c# mvvm viewmodel caliburn.micro


    【解决方案1】:

    我有一个非常相似的问题,我有一个指挥打开一个子虚拟机,然后会弹出一个确认框说“你想关闭吗”并为原始项目触发了回调 CanClose 方法有与您描述的效果相同。

    弹出的虚拟机会关闭,但在关闭时会触发一个回调,该回调应该关闭第一个虚拟机。

    我的指挥最终重新激活了原来的虚拟机,这很烦人。事件的顺序是:

    • 打开虚拟机 1
    • 尝试关闭 VM 1
    • CanClose 保护方法被触发
    • 在 VM 1 的 CanClose 中弹出 VM 2(使用相同的导体)
    • 点击了 VM 2 上的确认按钮
    • 确认按钮触发 CanClose 的回调并关闭 VM1
    • VM2 关闭
    • Conductor 记得 VM 1 在 VM 2 之前处于活动状态,因此在 VM 1 关闭后重新打开它

    最后我只是实现了一个在关闭后触发的接口。

    关闭后有工作要做的子项实现接口(@98​​7654323@)

    然后我在指挥上为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,因为当回调触发时,它会在那里抛出一个空引用异常。我应用的修复似乎没有造成不良影响,但我并没有真正研究为什么会引发 null ref 异常。

    我找不到任何其他方法来执行此操作,因为最后触发的事件似乎是停用事件,而且它们还为时过早。

    【讨论】:

    • 如果您有兴趣,我可能知道,为什么在 DefaultCloseStrategy.Execute() 中会抛出空引用异常。我不确定这是一个错误还是对框架的某种滥用,但我提出了一个问题:caliburnmicro.codeplex.com/workitem/301
    • 太棒了,我调查了一下,看到了 null ref 被抛出的地方,但没有比这更进一步,因为当时没有 CM 源/pdbs - 希望它会由 CM 团队修复。感谢您的信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多