【发布时间】:2014-01-25 23:59:05
【问题描述】:
我正在创建一个在数据网格中显示数千条记录的 WPF 应用程序。我在 ObservableCollection 中异步加载来自外部源的数据并将其绑定到数据网格。全天都会对网格进行一些添加和更新。
性能方面,ObservableCollection 是否适合这种应用程序,或者我应该寻找 ObservableDictionary 或任何其他合适的集合?
【问题讨论】:
标签: c# wpf observablecollection
我正在创建一个在数据网格中显示数千条记录的 WPF 应用程序。我在 ObservableCollection 中异步加载来自外部源的数据并将其绑定到数据网格。全天都会对网格进行一些添加和更新。
性能方面,ObservableCollection 是否适合这种应用程序,或者我应该寻找 ObservableDictionary 或任何其他合适的集合?
【问题讨论】:
标签: c# wpf observablecollection
我用它实时显示多达 10,000 条记录,没有任何问题。一旦您开始处理许多记录,瓶颈往往是算法选择和数据虚拟化问题(或缺乏虚拟化),而不是您使用的集合类。也就是说,如果您对此感到担心,那么您可以尝试使用 there's an article here with a WPF-decoupled ObservableCollection。
【讨论】:
ObservableCollection<T> 已从 WindowBase 中删除,并且自 .NET 4.0 起与 WPF 本身完全解耦。
DataGrid 使用 UI 虚拟化,以便仅绘制在视口区域可见的内容。 这减少了创建的 UI 元素的数量,因此使其在内存和性能方面更好。 但是,当您处理包含数千个项目的 ObservableCollections 时,您还应该考虑使用数据虚拟化技术。
我建议去 KIS(保持简单)并继续尝试最简单的方法: 只需使用 .NET ObservableCollection。
如果您在更新期间体验到 UI 滞后,您需要考虑尝试某种 ObservableCollection,它允许在更新阶段阻止 UI 更新(以防您需要在短时间内更新大量项目中的集合)。
如果您在滚动或选择时遇到 UI 卡顿,或者您的内存太高,您还需要考虑数据虚拟化。
祝你好运
【讨论】:
ObservableCollection 通知 View 添加到其中的每个项目,它不支持 AddRange() 方法。我会推荐ObservableCollection 的扩展类,它支持AddRange() 在此Answer 中发布的方法
该类会针对整个批量进行更新。而不是每个项目。其余性能将由 DataGrid 负责,默认情况下支持 Virtual StackPanel
【讨论】: