wpf - 在 WPF 中快速显示大型排序列表?

标签 wpf performance sorting large-data-volumes

我正在开发一个程序,该程序应该能够显示长数据列表(最多 500 项),这些数据在内容发生变化时需要重新排序。

本质上,我有一个带有可观察集合的 View 模型,该集合包含具有绑定(bind)到 gui 的可观察数据的类,显示在 ListView 中。

数据必须排序,但数据也可能随时变化,每次都需要对列表进行排序。

在不锁定 GUI 的情况下显示和保持整个事物的最佳机制/隐喻是什么?我有一个使用 NotifyCollectionChangedEventArgs 和一些排序函数的解决方案,但它很慢 - 我假设它每次更改数据元素时都会重新构建整个 GUI。

最佳答案

看看 CollectionView/CollectionViewSource类。这些类位于您的 ObservableCollection 和 WPF 的数据绑定(bind)逻辑之间,以便执行排序、过滤等操作。

我怀疑从 NotifyCollectionChanged 编写自己的排序函数是性能问题的根源;这取决于您的精确实现,但是当您对列表进行排序时,可能会引发一系列 CollectionChanged 事件,这会导致 WPF 在排序例程的每次迭代中重新绑定(bind)集合……这将非常慢,因为您描述。

CollectionView 和 CollectionViewSource 不会影响源集合,只会影响 UI 上显示的 Collection View ,因此您应该会看到比现在正在做的事情有显着的加速。当微软的DataGrid控件已发布,他们展示了它显示和排序数百万行的演示 - 它正是使用这些类来执行排序。您真的不应该在 500 行上看到性能问题。

最后,CollectionView 和 CollectionViewSource 的区别在于它们的设计用途;在 C# 中工作时使用 CollectionView,在 XAML 中工作时使用 CollectionViewSource。您可能还想看看 this article快速概览这些类。

关于wpf - 在 WPF 中快速显示大型排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2071632/

相关文章:

c# - 如何在自定义 WPF 控件中初始化集合属性

c++ - 您建议使用这两种将此数组转换为整数的方法中的哪一种?

对 key 对进行排序并可访问的 C# 结构?

c# - 使用属性定义 UI 的属性

java - 您可以在 WPF 应用程序中托管 Java swing 应用程序吗?

sql - 减少 T-SQL 查询的运行时间

java - "Math.abs()"的性能是否优于 "if"的表达式?

c++ - std::sort 没有复制构造

java - 在 O(n log n) 时间内生成长度为 n 且反转次数为 k 的数组的算法?

c# - WPF 绑定(bind)到变量/DependencyProperty