在过滤大约1000个项目的CollectionView时,我遇到了一些严重的速度问题。
我实质上是让用户从项目列表中进行选择,这里有一个按钮,使他们可以一次选择/取消选择所有项目。第一次按下此按钮时,过滤时间不到1秒。所有后续的过滤过程最多需要10秒钟。
这是相关代码
//Assume that these call PropertyChanged as needed
public IEnumerable<Item> Items { get; set; }
public CollectionViewSource SelectedItems { get; set; }
public void LoadItems()
{
Items = GetItemsFromDatabase();
SelectedItems = new CollectionViewSource()
{
Source = Items,
IsLiveFilteringRequested = true,
LiveFilteringProperties = { "IsSelected" }
};
SelectedItems.Filter += (src, args) =>
{
var item = args.Item as Item;
args.Accepted = item != null && item.IsSelected;
};
}
public void SelectAll()
{
using (SelectedItems.DeferRefresh())
{
Items.ForEach(f => f.IsSelected = true);
}
}
public void DeselectAll()
{
using (SelectedItems.DeferRefresh())
{
Items.ForEach(f => f.IsSelected = false);
}
}
视图是一个简单的数据网格
<DataGrid ItemsSource="{Binding SelectedItems}" AutoGenerateColumns="False">
<!-- etc -->
</DataGrid>
过滤非常简单,只是一个IsSelected
布尔值,我不确定究竟是什么导致了如此巨大的速度下降。
SelectAll
和DeselectAll
几乎立即运行。
每次Filter
上对CollectionViewSource
事件的调用在之间发生。
有什么建议吗?