2016-01-29 4 views
3

У меня действительно большой ObservableCollection<MyItem>, и мне нужно обеспечить удобную фильтрацию на нем.async CollectionViewSource-фильтрация?

public static async Task RefilterViewAsync(this ItemsControl @this, Predicate<object> compareLogic) 
{ 
    await Task.Run(
     () => 
     { 
      var collectionView = CollectionViewSource.GetDefaultView(@this.ItemsSource); 
      if (collectionView.CanFilter) 
      { 
       collectionView.Filter = compareLogic; 
      } 
      else throw new InvalidOperationException("Filtering not supported..."); 
      collectionView.Refresh(); 
     }); 
} 

.. проблема в том, что приведенный выше код не работает по ряду причин. Фитирование на UI-нитке занимает около 1 минуты. Любые идеи о том, как реализовать асинхронную фильтрацию, по крайней мере, чтобы отобразить некоторую анимацию «обработка ..», чтобы помочь пользователю преодолеть это?

ответ

1

Если у вас массивный ObservableCollection, и вы хотите отфильтровывать его асинхронно, сделайте это самостоятельно. Нет асинхронной привязки поддержки AFAIK.

Я имею в виду создать другое свойство типа ObservableCollection; это будет ваша отфильтрованная коллекция. Вместо привязки фактического сбора привяжите фильтрованную коллекцию к ItemsControl.

Затем реализуйте свою собственную логику фильтрации асинхронно (возможно, в другом потоке) и, наконец, установите свойство фильтрованной коллекции. Механизм привязки поднимет и обновит интерфейс. Я использовал это успешно в одном из моих проектов ранее.

Смежные вопросы