我有shell,其中包含TabViewModel(作为属性单独显示,并通过ContentControl显示在View中)。在TabViewModel中,我打开一个文档。文档的VM依赖于LoadSaveVM来加载和保存文档。文档VM本身就是IScreen对象的指挥,但它使用子VM来显示文档的数据。
到目前为止,一切都很有效。我已经实现了'脏'行为,即当文档被更改时,它被标记为脏,因此当关闭它时,会询问用户,他/她是否要保存它,不保存它,或取消关闭。
所有这些都是通过Caliburn.Micro的常规框架(IGuardClose
,DefaultCloseStrategy
,Conductor<IScreen>
等)来处理的。
问题在于,当文档VM关闭且用户选择保存时,我从List的枚举器中获取InvalidOperationException
,因为TabViewModel的 Items 属性发生了变化(显示LoadSaveVM处理保存)。
通过在Shell(SaveDocument)上调用coroutine来调用保存,它被委托给TabVM的ActiveItem,即文件VM,它返回协同程序,一旦在TabVM中执行LoadSaveVM就会结束。
从我的立场出发,可能有两种解决方案:
但是,在我看来,至少在我的情况下,两种解决方案都不是很干净。
注意:文档实际上是一个文件,加载/保存需要很长时间(因此LoadSaveVM会显示此类操作的进度)。