ICollectionView very poor performance while filtering

147 views Asked by At

I'm facing with big performance issue while I'm trying to filter ICollectionView.

Collection is populated with about 90000 rows (12 columns).

What I've tried to this very moment:

  1. used VirtualizingStackPanel.IsVirtualizingWhenGrouping
  2. enabled RowVirtualization and ColumnVirtualization
  3. used Dispatcher (still don't know what for and why)

Here I provide code, that shows what I'm trying to complete:

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;
}

I must admit that StartsWith method in UpdateFilter() works much faster, but it's not what I expect.

I have no more ideas how to manage that. Can you help ?

0

There are 0 answers