2013-03-17 38 views
2

我有一位父母指挥。我想在其中显示第一个视图模型。然后,在第一个关闭之后(即完成一些操作),我想显示一个不同的视图模型。显示一个孩子虚拟机,然后显示另一个,第一个被关闭后

我使用Caliburn.Micro.Contrib,其中ConductResult显示子虚拟机在导体。它有一个很酷的扩展方法AfterClosingDo,它运行一个协程后,该孩子被关闭和关闭。

然而,当我运行使用AfterClosingDo另一个ConductResult,基本上是这样发生的:

  • 第一个孩子VM关闭
  • 停用事件发生时,ConductResult运行AfterClosing行动
  • 在AfterClosing,我打开第二个孩子VM使用ConductResult在父母导体
  • 第二个孩子虚拟机已正确激活
  • 但是,第一个子VM的停用仍然没有完成,而项在导体

第一VM设置为活动基本上示出了负载操作的进度,第二VM示出实际数据。加载完成后,我想在父导体中显示数据(当然使用第二个VM)。

所以,我的问题:有没有干净的方式通过不重写指挥,屏幕的默认行为要做到这一点在Caliburn.Micro,最好等

我想用EventAggregator的,虽然我不确定,如果这是最好的解决方案。

回答

3

我有一个非常类似的问题,我有一个指挥家打开一个孩子的虚拟机,然后确认框会弹出“你想关闭”,并发起了原始项目CanClose方法的回调,和你描述的一样。

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

我的售票员最终重新激活了原本令人讨厌的虚拟机。事件的顺序是:

  • 打开VM 1
  • 尝试关闭VM 1
  • CanClose后卫方法在CanClose烧制
  • 弹出VM 2(使用相同的导体)VM 1的
  • 确认按钮虚拟机上2点击
  • 确认按钮火灾回调CanClose和关闭VM1
  • VM2关闭
  • 指挥记得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(); 
    } 

这使得确保回调WASN开火太早了。不知道这是否会使你受益(因为我没有使用contrib库),但它可能会给你一些想法。

唯一的缺点是我不得不修复DefaultCloseStrategy,因为回调会触发它,会在那里抛出一个空引用异常。我应用的修复似乎没有造成不良影响,但我没有真正查看为什么会引发null ref异常。

自上次事件发生以来,我无法找到任何其他方式来执行此操作,因为上次事件似乎是失效事件,而且它们还很早。

+0

如果您有兴趣,我可能知道,为什么在DefaultCloseStrategy.Execute()中引发空引用异常。我不确定这是一个错误还是某种滥用框架,但我提出了一个问题:http://caliburnmicro.codeplex.com/workitem/301 – mnn 2013-03-31 00:20:34

+0

真棒,我看了一下,看到了那里的null ref被抛出,但并没有远远超过当时没有CM source/pdbs的地方 - 希望它能被CM团队修复。谢谢(你的)信息! – Charleh 2013-03-31 23:25:41

相关问题