Фильтрация CollectionViewSource в другом потоке - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть список с 10 миллионами элементов, и я хочу выполнить поиск по элементам, например, автозаполнение на TextBox, но когда я нажимаю клавишу, для возврата collectionViewSource фильтру требуется вечность. Как я могу выполнить процесс фильтрации / обновления внутри Thread или BackgroundWorker?

пользовательского интерфейса:

<Window 
    x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="350" Width="525">
  <Grid>
    <TextBox TextChanged="txtSearch_OnTextChanged"/>            
    <ListBox ItemsSource="{Binding MyCollection}" >
  </Grid>
</Window>

Код сзади:

private string _filterString;
public string FilterString
{
    get => _filterString;
    set
    {
        _filterString = value;
        NotifyPropertyChanged("FilterString");
        _myCollection.Refresh();
    }
}

private ICollectionView _myCollection;
public ICollectionView MyCollection
{
    get => _myCollection;
    set 
    { 
        _myCollection = value; 
        NotifyPropertyChanged("MyCollection"); 
    }
}

MyCollection = CollectionViewSource.GetDefaultView(db.GetSampleCollection());
MyCollection.Filter = FilterResult;

public bool FilterResult(object obj)
{
    var words = obj as List<string>;
    return words.AsParallel().Any(t => t.Contains(_filterString));    
}

private async void txtSearch_OnTextChanged(object sender, TextChangedEventArgs e)
{
    FilterString = txtSearch.Text;    
}

1 Ответ

1 голос
/ 25 февраля 2020

Единственный способ сделать это - создать новый экземпляр CollectionViewSource в фоновом потоке, отфильтровать его там, а после этого вернуть его в поток пользовательского интерфейса и просто заменить текущий DataSource вашей сетки на новый создан и отфильтрован CollectionViewSource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...