ICollectionView очень низкая производительность при фильтрации - PullRequest
0 голосов
/ 29 января 2019

Я столкнулся с большой проблемой производительности, пытаясь отфильтровать ICollectionView.

Коллекция содержит около 90000 строк (12 столбцов).

То, что я пытался до сих пор:

  1. используется VirtualizingStackPanel.IsVirtualizingWhenGrouping
  2. включено RowVirtualization и ColumnVirtualization
  3. использовано Dispatcher (до сих пор не знаю, для чего и почему)

Здесь я предоставляю код, который показывает, что яЯ пытаюсь завершить:

private ICollectionView abcdxView;

public ICollectionView AbcdxView
{
    get
    {
        if (abcdxView == null)
        {
            abcdxView = CollectionViewSource.GetDefaultView(context.ut_abcdx.ToList());
        }
        return abcdxView;
    }
    set
    {
        abcdxView = value;
        OnPropertyChanged("AbcdxView");
    }
}

private void UpdateAbcdxFilter()
{
    dispatcher.BeginInvoke(new Action(() =>
        abcdxView.Filter = w =>
            (string.IsNullOrEmpty(IndeksFilter) ? true : StringFilter.Like(((ut_abcdx)w).indeks, IndeksFilter))));
}

private string indeksFilter;

public string IndeksFilter
{
    get { return indeksFilter; }
    set
    {
        indeksFilter = value;
        UpdateAbcdxFilter();
        OnPropertyChanged("IndeksFilter");
    }
}

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding AbcdxView,UpdateSourceTrigger=PropertyChanged}"  
          RowDetailsVisibilityMode="VisibleWhenSelected"
          EnableColumnVirtualization="True" VirtualizingStackPanel.IsVirtualizingWhenGrouping="True"  EnableRowVirtualization="True">


public static bool Like(string toSearch, string toFind)
{
    if (toSearch != null)
    {
        Regex findRegex = new Regex(Regex.Escape(toFind).Replace("%", ".*"), RegexOptions.IgnoreCase);
        return findRegex.IsMatch(toSearch);
    }

    return false;
}

Я должен признать, что метод StartsWith в UpdateFilter() работает намного быстрее, но это не то, что я ожидаю.

У меня нет больше идей, какуправлять этим.Вы можете помочь?

...