【问题标题】:Suitable ObservableCollection合适的 ObservableCollection
【发布时间】:2014-01-25 23:59:05
【问题描述】:

我正在创建一个在数据网格中显示数千条记录的 WPF 应用程序。我在 ObservableCollection 中异步加载来自外部源的数据并将其绑定到数据网格。全天都会对网格进行一些添加和更新。

性能方面,ObservableCollection 是否适合这种应用程序,或者我应该寻找 ObservableDictionary 或任何其他合适的集合?

【问题讨论】:

    标签: c# wpf observablecollection


    【解决方案1】:

    我用它实时显示多达 10,000 条记录,没有任何问题。一旦您开始处理许多记录,瓶颈往往是算法选择和数据虚拟化问题(或缺乏虚拟化),而不是您使用的集合类。也就是说,如果您对此感到担心,那么您可以尝试使用 there's an article here with a WPF-decoupled ObservableCollection

    【讨论】:

    • 这篇文章已经完全过时了,因为ObservableCollection<T> 已从 WindowBase 中删除,并且自 .NET 4.0 起与 WPF 本身完全解耦。
    【解决方案2】:

    DataGrid 使用 UI 虚拟化,以便仅绘制在视口区域可见的内容。 这减少了创建的 UI 元素的数量,因此使其在内存和性能方面更好。 但是,当您处理包含数千个项目的 ObservableCollections 时,您还应该考虑使用数据虚拟化技术。

    我建议去 KIS(保持简单)并继续尝试最简单的方法: 只需使用 .NET ObservableCollection。

    如果您在更新期间体验到 UI 滞后,您需要考虑尝试某种 ObservableCollection,它允许在更新阶段阻止 UI 更新(以防您需要在短时间内更新大量项目中的集合)。

    如果您在滚动或选择时遇到 UI 卡顿,或者您的内存太高,您还需要考虑数据虚拟化。

    祝你好运

    【讨论】:

      【解决方案3】:

      ObservableCollection 通知 View 添加到其中的每个项目,它不支持 AddRange() 方法。我会推荐ObservableCollection 的扩展类,它支持AddRange() 在此Answer 中发布的方法

      该类会针对整个批量进行更新。而不是每个项目。其余性能将由 DataGrid 负责,默认情况下支持 Virtual StackPanel

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-15
        • 1970-01-01
        • 2018-12-20
        相关资源
        最近更新 更多