首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListView数据虚拟化概念和实施

ListView数据虚拟化概念和实施
EN

Stack Overflow用户
提问于 2018-12-08 17:45:51
回答 1查看 115关注 0票数 1

我正在尝试获得一个简单的ListView来执行,同时可能加载数以千计的项目。似乎实现这一目标的最好方法是使用虚拟化--具体地说就是数据虚拟化。但是我不能让它工作,或者我只是简单地误解了概念。

我有一个简单的存储库,从Sqlite返回像这样的POCO类:

代码语言:javascript
复制
public async Task<IEnumerable<T>> FindAllAsync(Action<T> predicate);

然后在XAML中,我有类似这样的东西:

代码语言:javascript
复制
<Style x:Key="VirtualisedMetroListView" BasedOn="{StaticResource MetroListView}" TargetType="{x:Type ListView}">
    <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
    <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True" />
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True" />
    <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
</Style>

ListView使用的。现在我真的对"VirtualizingStackPanel“或MahApps "VirtualisedMetroListView”一无所知,因为特别是后者,几乎没有文档。但是上面的构造似乎对某些人有效?

无论如何,这对我不起作用,坦率地说,我不明白它为什么要起作用!数据虚拟化不是应该只从ListView获取可见(请求)的内容吗?但是,对于我上面的存储库,这是如何工作的呢?它总是返回T的所有项,而不仅仅是列表中可见的20项。

有没有人有链接到这方面的工作例子?或者耐心地向我解释这个概念:)

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-12-08 18:51:22

虚拟化面板是关于UI虚拟化而不是数据虚拟化。

UI专家建议向用户显示最多200行。更多,你应该过滤,以便用户不必滚动,滚动和滚动……找到他们要找的那一排。

实际上,我建议你在linq中使用skip和take。或者在你的存储库中添加另一个在内部执行此操作的方法,或者公开iqueryable而不是ienumerable。然后,您可以在异步方法中循环。使用异步调用获取前100条记录。转换为视图模型。将其返回给UI线程。Foreach,sdd到您的绑定可见集合。通过等待task.Delay(500)或其他方法释放UI线程。还有..。继续跳过和获取,直到你有了所有的数据。

如果按照用户通常希望使用的顺序对它们进行排序,那么您就可以实现用户分页。使用take(50)获得第一个完整屏幕的价值,然后通过单击next按钮让他们“翻页”。或者创建一个页面按钮的itemscontrol,允许它们在列表中的任何位置进行分页。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53681295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档