我用 250 行填充数据网格。当用户使用滚动条向下滚动时(例如低于 75%),我想从数据库中获取接下来的 250 行,等等。这个想法是网格可能有数百万个结果,我们不想加载它们,直到用户请求它们。是否有针对此的现有机制?
编辑:因为似乎有很多困惑:我不是在寻找标准的数据虚拟化解决方案,我已经在使用 them .但它们都要求您提前指定“虚拟行”的数量,而该查询对我来说代价高昂。他们需要它的原因是因为当您知道网格中的总项目时,它可以更容易地计算当前页面/偏移量/等。但计算该数量是一个非常昂贵的 sql 查询,所以我想迁移到另一个解决方案,在那里我可以跳过 COUNT() 查询。
最佳答案
所以看起来 DataGrid 的虚拟化属性对您没有帮助,因为它需要一个完整的数据集在 ItemsSource
中。
所以要有一个数据延迟加载(见文章Data Virtualization)你可以处理ScrollViewer.ScrollChanged事件并应用经典的服务器端分页方法。基本上你必须定义和计算像 Page Size
, Page Number
, Sort Order
这样你可以从数据库请求一个所需的数据集并将其显示在 UI 上。每次 Current Page Number
或 Sort Order
发生变化时,您需要请求数据并更新网格的 ItemsSource
,也许您还需要也恢复滚动位置,但我不确定。
- 计算可见项的数量
- 使用 PageNumber、PagiSize 等参数对数据库使用参数化查询进行数据请求
- 通过刚刚加载的数据项更新 DataGrid ItemsSource
我认为主要的挑战是计算页面大小、当前页码的值。我相信Logical Scrolling mode 将在这方面帮助您。
关于WPF 数据网格 : Lazy Loading/Inifinite scroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581732/