WPF数据网格:延迟加载/有限滚动

WPF数据网格:延迟加载/有限滚动,wpf,database,datagrid,scroll,virtualization,Wpf,Database,Datagrid,Scroll,Virtualization,我用250行填充数据网格。当用户使用滚动条向下滚动时(例如低于75%),我想从数据库中获取接下来的250行,依此类推。这个想法是网格可以有数百万个结果,我们不想全部加载,直到用户请求。有没有一个现有的机制 编辑:因为似乎有很多困惑:我不是在寻找标准的数据虚拟化解决方案,我已经使用了。但它们都要求您提前指定“虚拟行”的数量,而该查询对我来说代价太高。他们之所以需要它,是因为当您知道网格中的项目总数时,它使计算当前页面/偏移量/等变得更加容易。但计算该金额是一个非常昂贵的sql查询,因此我想迁移到另

我用250行填充数据网格。当用户使用滚动条向下滚动时(例如低于75%),我想从数据库中获取接下来的250行,依此类推。这个想法是网格可以有数百万个结果,我们不想全部加载,直到用户请求。有没有一个现有的机制


编辑:因为似乎有很多困惑:我不是在寻找标准的数据虚拟化解决方案,我已经使用了。但它们都要求您提前指定“虚拟行”的数量,而该查询对我来说代价太高。他们之所以需要它,是因为当您知道网格中的项目总数时,它使计算当前页面/偏移量/等变得更加容易。但计算该金额是一个非常昂贵的sql查询,因此我想迁移到另一个解决方案,在那里我可以跳过COUNT()查询。

将DataGrid的
EnableRowVirtualization
属性设置为
true


因此,当用户滚动时,将加载行,因此实际上只加载可见行

,因此看起来DataGrid的虚拟化属性对您没有帮助,因为它要求在
项资源中有完整的数据集

所以,要实现数据延迟加载(请参阅一篇文章),您可以处理事件并应用经典的服务器端分页方法。基本上,您必须定义和计算这样的符号,如
页面大小
页码
排序顺序
,这样您就可以从数据库请求所需的数据集并在UI上显示它。每当
当前页码
排序顺序
发生变化时,您需要请求数据并更新网格的
项目资源
,也可能需要恢复滚动位置,但我不确定这一点

  • 计算可见项目的数量
  • 使用PageNumber、PagiSize等参数,使用参数化查询对数据库执行数据请求
  • 通过刚加载的数据项更新DataGrid ItemsSource

我认为一个主要的挑战是计算页面大小的值,即当前的页码。我相信模式会在这方面对您有所帮助。

您可能是对的。但这个问题已经接受了“使用数据虚拟化”作为答案。我已经用过了,所以对我来说,这不是问题的答案,只是一个选择。现在我明白了。当DataContext/ItemsSource已绑定到整个数据集时,虚拟化可能会有所帮助,但您需要在数据访问级别上进行延迟加载您使用的是WPF 3.5还是WPF 4?@Joshua您是要求UI虚拟化还是数据虚拟化?如果是UI,下面的答案是正确的。如果是数据,则sll发布的链接是正确的。我目前在网格中使用数据虚拟化,但它迫使我知道总共有多少行,对于一些查询,我不想计算这些行。您似乎不理解这个问题,虚拟化只在需要时创建数据的可视化表示,问题是如何仅在需要时获取上述数据,这是在一个完全不同的层面上。现在我理解了这个问题,因为您的编辑使其更加清晰:)抱歉误导您:/谢谢。恐怕你是对的,我得为这件事写我自己的逻辑。我真的希望有一个现有的组件或示例代码可以用作基础。你有机会尝试这个Muis吗?