Я столкнулся с большой проблемой производительности, пытаясь отфильтровать ICollectionView.
Коллекция содержит около 90000 строк (12 столбцов).
То, что я пытался до сих пор:
- используется
VirtualizingStackPanel.IsVirtualizingWhenGrouping
- включено
RowVirtualization
и ColumnVirtualization
- использовано
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()
работает намного быстрее, но это не то, что я ожидаю.
У меня нет больше идей, какуправлять этим.Вы можете помочь?