2011-07-22 10 views
2

私は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イベントに移動しようとしましたが、これには以前の段落を考慮しても不思議な問題があります。

おかげ

+0

ロードされていないビューが間違いなくあなたの問題に寄与していると思います(ただし、他の問題もあります)。私が使用している標準は、ViewLoadedコルーチンをViewLoadedコルーチンをビューロードされたイベント、すなわちこれにより、組み込みのコルーチンインフラストラクチャが使用されます。それを試して、結果が何であるかを教えてください。IsBusyプロパティはどのように実装されていますか –

+0

@SimonそのEventTriggerをビューに追加しますか? CMはそれをあなたのために追加しないのですか? –

+0

@Derekはいビューに追加します。CMの 'Screen'は' OnViewLoaded'を提供しますが、それはコルーチン(voidの戻り型)ではありません。この方法を使用すると、a)ビューが完全にロードされ、b)コルーチンを呼び出すための 'ActionMessage'インフラストラクチャを使用できるようになります(つまり、コルーチンのコンテキストパラメータが正しくインスタンス化されることを意味します。いくつかの場合に有用である)。 –

答えて

2

ThisはCMでビジーインジケータを行う方法の良い例です。あなたが行うことができますあなたのコルーチンから次に

[Import(RequiredCreationPolicy = CreationPolicy.Shared)] 
public IBusyWatcher Busy { get; set; } 

private IEnumerable<IResult> LoadData() 
{ 
    using (Busy.GetTicket()) 
    { 
    ... 
    } 
} 
+0

ビジーインジケータ自体は問題ありません。問題は、バインディングがビューに伝播していないことです。とにかくありがとう。 – Harry

0

あなたはclient.AsyncOp();client.AnotherAsyncOp();が非同期であることを示してきたが、それはそこに何が起こっているかは明らかではありませんので、あなたが実装を示していませんでした。

Caliburn.Microは非同期操作を行いませんが、UIスレッドで実行されないように、またBusyIndi​​catorをブロックするように、IResultの内部で作業する必要があります。

コルーチンの実際の説明はhere、特にthis diagramです。コルーチンがフレームワークによってどのように実行されるのかを明確にする必要があります。

関連する問題