我用250行填充Datagrid。当用户使用滚动条向下滚动时(例如,低于75%),我想从数据库中获取接下来的250行,依此类推。我们的想法是,网格可能有数百万个结果,我们不希望将它们全部加载,直到用户请求它们为止。是否有现成的机制?
编辑:因为似乎存在很多困惑:我不是在寻找标准数据虚拟化解决方案,我已经使用them。但是它们都要求你提前指定“虚拟行”的数量,而这个查询对我来说代价很高。他们之所以需要它,是因为当你知道网格中的总项数时,它会更容易计算当前页面/偏移量等。但是计算该数量是一个非常昂贵的SQL查询,所以我想迁移到另一个我可以跳过COUNT()查询的解决方案。答案 0 :(得分:1)
所以看起来DataGrid的Virtualization属性对你没有帮助,因为它需要一个完整的数据集在ItemsSource
。
为了实现数据延迟加载(请参阅文章Data Virtualization)您可以处理ScrollViewer.ScrollChanged事件并应用传统的服务器端分页方法。基本上,您必须定义和计算诸如Page Size
,Page Number
,Sort Order
之类的单词,这样您就可以从数据库请求所需的数据集并在UI上显示它。每当Current Page Number
或Sort Order
发生变化时,您需要请求数据并更新网格的ItemsSource
,也许您还需要恢复滚动位置,但我不确定此
我认为主要的挑战是计算页面大小,当前页码的值。我相信Logical Scrolling模式可以帮助你。
答案 1 :(得分:0)
将DataGrid的EnableRowVirtualization
属性设置为true
因此,当用户滚动时将加载行,因此实际只会加载可见行