0

我有外壳,其中包含 TabViewModel(单独作为属性,并通过 ContentControl 显示在视图中)。在 TabViewModel 我打开一个文档。文档的 VM 又依赖于 LoadSaveVM 来加载和保存文档。Document VM本身是IScreen对象的Conductor,但是使用子VM来显示文档的数据。

直到现在,一切都很顺利。我已经实现了“脏”行为,即当文档被更改时,它被标记为脏,因此当关闭它时,会询问用户,如果他/她想要保存它,不要保存它,或者取消关闭。

所有这些都是通过 Caliburn.Micro 的常规框架(IGuardCloseDefaultCloseStrategyConductor<IScreen>等)处理的。

问题是,当文档 VM 被关闭并且用户选择保存时,我InvalidOperationException从 List 的Enumerator获得,因为 TabViewModel 的Items属性发生了变化(LoadSaveVM 显示为处理保存)。

通过调用Shell上的协程(SaveDocument)调用保存,委托给TabVM的ActiveItem,即Document VM,返回协程,在TabVM中执行LoadSaveVM就结束。

从我的立场来看,有两种解决方案:

  • 修改 TabViewModel 的关闭策略
  • 修改 DocumentVM 的 SaveDocument 协程的行为,直到加载/保存完成后才会结束。

但是,在我看来,这两种解决方案都不是很干净,至少在我的情况下是这样。

注意:文档实际上是一个文件,加载/保存需要很长时间(因此 LoadSaveVM 显示此类操作的进度)。

4

0 回答 0