BusyIndicatorがあり、ビューモデルのBusyプロパティにIsBusyをバインドしています。
<xctk:BusyIndicator IsBusy="{Binding Busy}" x:Name="busyBox" Grid.Row="2"
HorizontalAlignment="Center"
VerticalAlignment="Center" BusyContent="Contacting Server" >
</xctk:BusyIndicator>
Webサービス呼び出し(非同期)を開始するときにbusyをtrueに切り替え、コールバックでfalseに設定します。
これは、最初はうまく機能し、その後は毎回ビジーインジケーターが表示されなくなります。コールバックにthread.sleepを追加しました(x = caseの場合、2回目は動きが速すぎました)。
他のバインドされたコントロールが期待どおりに機能しているため、プロパティが正しく通知していることを知っています。ビジーインジケーターは1回の使用にのみ適しているようです
(ところで、私はmvvm light toolkit v3を使用しています)
モデルコードを表示
this.Busy = true; //This proverty is declared correctly with notifications etc
IPersonSearchService searcher = new PersonSearchService(); //class that does my webservice, ad i pass it a callback method from my UI (see below)
searcher.FindByPersonDetails(ps, GetAllPeopleCallback);
private void GetAllPeopleCallback (PersonSearchResult result, Exception e)
{
this.Busy = false;
((Models.PersonSearch)this.Model).Persons = result.Persons; //bound to my grid
CommandManager.InvalidateRequerySuggested(); //i need to do this to make a button who's canexecute command binding happen
}
これは、Webサービスにヒットするクラスです
class PersonSearchService : IPersonSearchService
{
public void FindByPersonDetails(WSPersonSearch.PersonSearch ps, Action<PersonSearchResult, Exception> Callback)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
WSPersonSearch.PersonSearch search = (WSPersonSearch.PersonSearch)args.Argument;
PersonSearchWebServiceClient wc = new PersonSearchWebServiceClient();
PersonSearchResult r = wc.FindByPersonDetails(ps);
args.Result = r;
};
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
PersonSearchResult result = (PersonSearchResult)args.Result;
Callback(result, null);
};
worker.RunWorkerAsync();
}
}
UIの他のすべてはうまく動作します。私のボタンは正しくアクティブ化/非アクティブ化されます。私のグリッドはうまく更新されますなど