我有一个Rest服务,它返回页面中的数据。我知道在获得第一个结果集后有多少页数据。现在我想在WPF应用程序中使用此服务,例如在网格控件(或列表视图)中显示结果。
问题是整个分页机制对最终用户应该是透明的,因此除了在网格中滚动之外,它们不应该通过任何方式触发数据获取。这有可能,你会如何解决这个问题?
答案 0 :(得分:1)
以下是您的任务的另一种可能解决方案:http://www.devzest.com/blog/post/wpf-data-virtualization.aspx
主要思想是创建自己的 IList 实现,它将封装所有异步页面加载功能。
作为奖励,该文章包含具有一组附加功能的完整示例代码:
- 选择,排序和过滤效果很好,就像所有数据都存储在本地一样;
- 根据需要在单独的线程中加载数据,而不阻止UI;
- 加载数据时的视觉反馈;如果失败,用户可以重试上次失败的尝试。
答案 1 :(得分:0)
将您的网格或列表放入ScrollViewer,订阅ScrollChanged事件,然后使用event args属性确定您是否足够接近可滚动区域的末尾,并从您的服务请求下一页,以及最后将收到的数据添加到列表或网格的末尾。
简而言之。如果您需要更具体的例子,请告诉我。
编辑:好的,假设您使用System.Windows.Controls.DataGrid
控件来显示数据。我正在做这个假设,因为你已经说过你的网格确实具有内置的滚动功能,并且没有其他名称类似于网格的控件确实拥有它。而且因为使用DataGrid进行数据显示是有意义的。 :)
您声明您的DataGrid如下:
<DataGrid HorizontalAlignment="Left" Margin="20,10,0,0"
VerticalAlignment="Top" Height="301" Width="498"
ScrollViewer.ScrollChanged="DataGrid_ScrollChanged_1"
ItemsSource="{x:Static Fonts.SystemFontFamilies}">
</DataGrid>
请注意,我正在使用ScrollViewer.ScrollChanged
路由事件。这是可能的,因为DataGrid确实内置了ScrollViewer。这意味着可以订阅该事件并分析它的参数。
以下是我如何处理此事件以进行测试:
private void DataGrid_ScrollChanged_1(object sender, ScrollChangedEventArgs e)
{
Debug.WriteLine("Extent height: " + e.ExtentHeight +
", vertical offset: " + e.VerticalOffset +
", viewport height: " + e.ViewportHeight);
}
当我的数据网格滚动到顶部时,我看到以下输出:
Extent height: 267, vertical offset: 0, viewport height: 13
当它滚动到底部时:
Extent height: 267, vertical offset: 254, viewport height: 13
因此,很容易确定何时接近底部并采取相应行动:
const int threshold = 20;
if (e.ExtentHeight <= e.VerticalOffset + e.ViewportHeight + threshold)
{
AskForNextPage();
}
当然,这里有一些细微差别。如果您已经下载了一些页面,并且已经加载了多少页面,则需要跟踪,以避免数据重复和其他不一致。老实说,与我在这里写的相比,这将是最困难的部分。 :)
答案 2 :(得分:0)
我认为这个问题很有意思但是对于stackoverflow窗口来说答案太长了所以我构建了一个使用预取集合视图的简单应用程序。
这与伍德曼发布的方法类似。
https://github.com/mrange/CodeStack/tree/master/q14793759/AutoFetching
有趣的代码在类中:PrefetchingCollectionView