代码之家  ›  专栏  ›  技术社区  ›  m00ni

具有数百万行的WPF ListView

  •  2
  • m00ni  · 技术社区  · 11 年前

    我需要在列表视图中显示大量数据,最多可以显示500万行或更多行。我正在尝试找到一个解决方案,在这个解决方案中,我可以显示所有500万项,而不需要在应用程序内存中存储所有的500万项。

    所以基本上,想法是只显示一小部分项目,比如1k或2k,当滚动新数据时,可以根据需要从数据库中检索。因此,应用程序内存中的项目永远不会超过几千个。然而,用户不应该意识到这一点,listview的行为应该像它有500万行一样。这意味着如果他向下拖动滚动条,它应该显示500万行中的最后一行,而不是当前内存中几千行中的最末一行。

    你们中有人知道如何实现这样的功能吗?我很感谢您提供的任何意见。

    谢谢 m00镍

    1 回复  |  直到 7 年前
        1
  •  1
  •   mcwyrm    8 年前

    wpf中的数据虚拟化备受讨论- here 是一个很好的开始。

    我已经实现了一种与我在网上找到的方法有些不同的方法。它并不完美,但很适合我的需求。

    我有一个通用的ItemsProvider接口,它可以对数据进行分页,并公开一些其他基本功能和有关支持数据的信息。我还创建了一个VirtualizationManager类,该类继承自 DependencyObject 并具有依赖性财产 ScrollableHeight VerticalOffset 。这些绑定到上的匹配财产 ScrollViewer (在您的finer的模板中找到 ItemsControls ). 当这些财产中的任何一个发生更改时,它们会触发一个回调,计算滚动查看器与(当前加载的)列表末尾的距离-为此,我的VirtualizationManager需要ItemsProvider的句柄-如果该值小于某个最小值,则指示ItemsProducer加载下一页。整个装置可以安装在 ItemsControl 通过一组附加的财产。

    我的实现相当独特,但想法相当简单。

    如果您正在处理非常大的列表,您将需要一个解决方案,它不仅可以增量加载,还可以卸载旧项。在上面的链接中至少有一个这样的解决方案。