2

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

本质上,我有一个带有可观察集合的视图模型,其中包含具有绑定到 gui 的可观察数据的类,这些类显示在 ListView 中。

数据必须排序,但数据也可能随时变化,每次都需要重新排序。

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

4

1 回答 1

8

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

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

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

最后,CollectionView 和 CollectionViewSource 的区别在于它们的设计用途;使用 C# 时使用 CollectionView,使用 XAML 时使用 CollectionViewSource。您可能还想查看这篇文章以快速了解这些类。

于 2010-01-15T14:01:30.290 回答