2

私には親の指揮者が1人います。その中に最初のビューモデルを表示したい。次に、最初のビューモデルが閉じられた後 (つまり、何らかの操作が行われた後)、別のビューモデルを表示したいと思います。

私はCaliburn.Micro.Contribを使用しています。ここでは、ConductResultがConductorに子 VM を表示します。その子が非アクティブ化されて閉じられた後にコルーチンを実行する、クールな拡張メソッドAfterClosingDoがあります。

ただし、を使用して別の ConductResult を実行するとAfterClosingDo、基本的に次のようになります。

  • 最初の子 VM は閉じられています
  • Deactivated イベントが発生し、ConductResult が AfterClosing アクションを実行します
  • AfterClosing で、親 Conductor の ConductResult を使用して 2 番目の子 VM を開きます
  • 2 番目の子 VM が適切にアクティブ化されている
  • ただし、最初の子 VM の非アクティブ化はまだ完了しておらず、コンダクターでnull項目がアクティブとして設定されています。

最初の VM は基本的にロード操作の進行状況を示し、2 番目の VM は実際のデータを示します。読み込みが完了したら、親 Conductor にデータを表示したいと思います (もちろん、2 番目の VM を使用します)。

それで、私の質問: でこれを行うためのクリーンな方法はありますかCaliburn.Micro?

EventAggregatorを使用することを考えていましたが、それが最善の解決策であるかどうかはわかりません。

4

1 に答える 1

3

コンダクターが子 VM を開くという非常によく似た問題があり、「閉じますか」という確認ボックスがポップアップし、元の項目CanCloseメソッドのコールバックが発生しました。あなたが説明しました。

ポップアップ VM は閉じますが、閉じるときに、最初の VM を閉じるはずのコールバックが発生します。

私のコンダクターは元の VM を再アクティブ化してしまい、面倒でした。イベントの順序は次のとおりです。

  • VM 1 を開く
  • VM 1 を閉じてみる
  • CanClose ガード メソッドが起動されました
  • VM 1 の CanClose で VM 2 をポップアップ (同じコンダクターを使用)
  • VM 2 の確認ボタンがクリックされる
  • 確認ボタンが CanClose のコールバックを起動し、VM1 を閉じます
  • VM2 が閉じる
  • Conductor は、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();
    }

これにより、コールバックが早すぎないようにしました。これがあなたに役立つかどうかはわかりませんが (私は contrib ライブラリを使用したことがないため)、いくつかのアイデアが得られるかもしれません。

DefaultCloseStrategyこれの唯一の欠点は、コールバックが起動するとそこに null 参照例外がスローされるため、修正する必要があったことです。私が適用した修正は悪影響を及ぼさないように見えましたが、null ref 例外がスローされた理由を実際には調べていません。

発生する最後のイベントは非アクティブ化イベントのようで、まだ早いので、これを行う他の方法を見つけることができませんでした。

于 2013-03-17T21:07:11.650 に答える