2016-05-19 11 views
-1

Я использую индикатор занятости wpf и устанавливаю его свойство Isbusy из viewModel. Aftersetting Isbusy Свойство Я хочу отфильтровать свой ICollectionview и нажать на него. Эта операция Filter я поставил вwpf Индикатор занятости не отображается, после чего следует 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); 
     }; 
    })); 

Обход: Если я ставлю Task.Delay(200).Wait(); после установки IsBusy, индикатор занятости будет отображаться в некоторых случаях.

+0

Что это значит **
** укажите в WPF? – ViVi

ответ

0

Filter всегда работает на потоке пользовательского интерфейса, сохраняя его слишком занятым, чтобы фактически обновить пользовательский интерфейс, чтобы отразить состояние IsBusy.

В большинстве случаев функции Filter должны выполняться достаточно быстро, чтобы не требовать специальной обработки. Однако, если вы уверены, что вам нужно запустить отнимающий много времени фильтр, тогда лучший способ сделать это - разделить на две различные коллекции: MyCollection и MyFilteredCollection. Тогда, в любое время 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 предотвратит MyCollection и SearchText от изменения).