ICollectionView过滤时的性能非常差

时间:2019-01-29 08:11:04

标签: c# wpf icollectionview

在尝试过滤ICollectionView时,我遇到了较大的性能问题。

集合中填充了大约90000行(12列)。

此刻我尝试过的事情:

  1. 使用过的VirtualizingStackPanel.IsVirtualizingWhenGrouping
  2. 启用了RowVirtualizationColumnVirtualization
  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()方法的运行速度要快得多,但这不是我期望的。

我已经不知道如何管理它了。你能帮忙吗?

0 个答案:

没有答案