TabViewModel を含むシェルがあります (プロパティとして個別に、ContentControl を介してビューに表示されます)。TabViewModel でドキュメントを開きます。ドキュメントの VM は、ドキュメントの読み込みと保存を LoadSaveVM に依存します。それ自体が IScreen オブジェクトのコンダクターであるドキュメント VM は、子 VM を使用してドキュメントのデータを表示します。
今まで、すべてがかなりうまくいきました。「ダーティ」動作を実装しました。つまり、ドキュメントが変更された場合、ドキュメントはダーティとしてマークされます。したがって、ドキュメントを閉じるときに、保存するか、保存しないか、閉じるのをキャンセルするかをユーザーに尋ねます。
これらはすべて、Caliburn.Micro の通常のフレームワーク ( IGuardClose
、DefaultCloseStrategy
、Conductor<IScreen>
など) を通じて処理されます。
問題は、ドキュメント VM が閉じられ、ユーザーが保存を選択すると、TabViewModel のItemsInvalidOperationException
プロパティが変更されるため、List のEnumeratorから取得されることです (LoadSaveVM は保存を処理するように示されています)。
保存は、TabVM の ActiveItem、つまりコルーチンを返すドキュメント VM に委譲されたシェル (SaveDocument) でコルーチンを呼び出すことによって呼び出され、TabVM で LoadSaveVM が実行されるとすぐに終了します。
私の立場からすると、2 つの解決策が考えられます。
- TabViewModel のクロージング戦略を変更する
- ロード/保存が完了するまで終了する DocumentVM の SaveDocument コルーチンの動作を変更します。
ただし、私の意見では、少なくとも私の場合、どちらのソリューションもあまりクリーンではありません。
注: ドキュメントは実際にはファイルであり、ロード/保存には時間がかかります (したがって、LoadSaveVM はそのような操作の進行状況を示します)。