gpt4 book ai didi

c# - 显示一个子 VM,然后在第一个关闭后显示另一个

转载 作者:行者123 更新时间:2023-11-30 22:19:38 25 4
gpt4 key购买 nike

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

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

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

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

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

那么,我的问题是:在 Caliburn.Micro 中是否有一种简洁的方法来执行此操作,最好不要覆盖 Conductor、Screen 等的默认行为。

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

最佳答案

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

弹出 VM 将关闭,但在关闭时会触发回调,该回调本应关闭第一个 VM。

我的指挥最终重新激活了令人讨厌的原始 VM。事件的顺序是:

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

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

关闭后有工作要做的子项目实现接口(interface)(IAfterClose)

然后我在 conductor 上为 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 异常。

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

关于c# - 显示一个子 VM,然后在第一个关闭后显示另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com