2016-05-19 4 views
-1

が続いたときに、私は、WPFビジーインジケータを使用してのViewModelからそのIsbusyプロパティを設定しています表示されません。アフターセッティングIsbusyプロパティICollectionviewをフィルタリングしてUIにプッシュしたい。私ははApplication.Current.Dispatcher.BeginInvokeコード

IsBusy = true; 
await Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
    new System.Action(() => 
    { 
     this.MyCollectionView.Filter = item => 
     { 
     Iitem IdName = item as Iitem; 
     return Regex.IsMatch(IdName.Name, SearchText, RegexOptions.IgnoreCase); 
     }; 
    })); 

回避策に入れている。このFilter操作は:私はIsBusyを設定した後Task.Delay(200).Wait();を置く場合は、ビジーインジケータは、いくつかのケースのために表示されます。

+0

はこの**
**は、WPFで何を示していますか? – ViVi

答えて

0

FilterはUIスレッドで常に実行され、実際にはUIを更新してIsBusyの状態を反映するにはビジー状態です。

ほとんどのケースでは、Filterの機能が十分に速く、彼らは特別な処理を必要としないことを実行する必要があります。 MyCollectionMyFilteredCollection:あなたは時間のかかるフィルタを実行する必要があることを確信している場合は、それを行うための最善の方法は、2つの異なるコレクションに分割することです。その後、任意の時間MyCollection(またはフィルタ)の変更は、このような何か:

IsBusy = true; 
var items = MyCollection.ToList(); 
var filter = SearchText; 
MyFilteredCollection = await Task.Run(() => 
    items.Where(x => Regex.IsMatch(x.Name, filter, RegexOptions.IgnoreCase))); 
IsBusy = false; 

を(これはIsBusyが変化するからMyCollectionSearchTextを予防することを前提としてい)。