私はViewModelを作成し、直ちにそれをアクティブにするCMでView Modelの最初のアプローチを使用しています。ビューモデルのコンストラクタで、私はこの方法を使ってコルーチンを始めています:Caliburn Microのコンストラクタでコルーチンが開始されました。
Coroutine.BeginExecute(Example().GetEnumerator());
それは忙しい上のIsBusyプロパティにバインド双方向です(私は私の意見でビジーインジケータを持っている、と私は忙しいプロパティを設定しますインジケータコントロール)をtrueに設定します。 trueの場合、インジケータが表示されます。偽の場合、それは隠されています。
IsBusy = true;
var example = client.AsyncOp();
yield return example;
var exampletwo = client.AnotherAsyncOp();
yield return exampletwo;
IsBusy = false;
問題はIsBusy正しくビューに伝播しないように見える:
だから私のコルーチンは、次のようになります。インジケーターが表示されない場合もあります。インジケータが表示される他の場面(最も一般的)がありますが、IsBusyがfalseに設定されてもオフにならない場合があります。
これはさまざまな他のプロパティで発生するため、これはビジー状態のインジケータの問題ではないと思います。たとえば、ListBoxのSelectedItemにバインドされているプロパティを設定した場合、そのプロパティは設定されますが、ListBoxはそれをSelectedItemとしてGUIに表示しません。
コルーチンが最初に実行されたときにViewsプロパティのカウントが0になり、最初にyield return
の後にカウントが1になります。私は間違っているかもしれませんが、CMがビューをフックアップしている場合や、プロパティを設定している場合、何らかの競合状態が起こっているようです。
また、CoroutineをOnViewLoadedイベントに移動しようとしましたが、これには以前の段落を考慮しても不思議な問題があります。
おかげ
ロードされていないビューが間違いなくあなたの問題に寄与していると思います(ただし、他の問題もあります)。私が使用している標準は、ViewLoadedコルーチンをViewLoadedコルーチンをビューロードされたイベント、すなわち i:EventTrigger> i:Interaction.Triggers>これにより、組み込みのコルーチンインフラストラクチャが使用されます。それを試して、結果が何であるかを教えてください。IsBusyプロパティはどのように実装されていますか –
@SimonそのEventTriggerをビューに追加しますか? CMはそれをあなたのために追加しないのですか? –
@Derekはいビューに追加します。CMの 'Screen'は' OnViewLoaded'を提供しますが、それはコルーチン(voidの戻り型)ではありません。この方法を使用すると、a)ビューが完全にロードされ、b)コルーチンを呼び出すための 'ActionMessage'インフラストラクチャを使用できるようになります(つまり、コルーチンのコンテキストパラメータが正しくインスタンス化されることを意味します。いくつかの場合に有用である)。 –