我正在开发一个程序,该程序应该能够显示长数据列表(最多 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/