【问题标题】:ListView Data Virtualization concepts and implementationListView 数据虚拟化概念和实现
【发布时间】:2018-12-08 09:45:50
【问题描述】:

我试图让一个简单的 ListView 执行,同时可能加载数千个项目。似乎实现这一目标的最佳方法是使用虚拟化——特别是数据虚拟化。但我无法让它发挥作用,或者我只是误解了这些概念。

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

public async Task<IEnumerable<T>> FindAllAsync(Action<T> predicate);

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

<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 个。

有人有这个工作示例的链接吗?或者耐心地向我解释这个概念:)

谢谢。

【问题讨论】:

  • 虚拟化并不意味着它只会获取可见的数据。它总是会获取所有数据。虚拟化意味着控件将仅为当前屏幕上可见的项目创建可视元素(内容)。
  • 谢谢@Nick,这也是我的理解。但是我对一些网站以不同的方式谈论 UI 和数据虚拟化感到困惑。并且只需要确保我应该使用的数据虚拟化概念中没有发生任何魔法......

标签: c# wpf listview virtualization mahapps.metro


【解决方案1】:

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

UI 专家建议最多向用户显示大约 200 行。再多一点,您应该进行过滤,这样用户就不必滚动和滚动和滚动......来找到他们正在寻找的一行。

事实上,我建议你使用跳过并接受你的 linq。在您的存储库中添加另一种在内部执行此操作的方法,或者公开 iqueryable 而不是 ienumerable。 然后,您可以循环使用异步方法。 使用异步调用获取前 100 条记录。 转换为视图模型。 将其返回到 ui 线程。 Foreach, sdd 到你绑定的 observablecollection。 通过 await task.Delay(500) 或其他方式释放 ui 线程。 并且...继续跳过和获取,直到您拥有所有数据。

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

【讨论】:

  • UI 专家的重要观点......似乎是处理这个问题的正确方法。但是继续这个想法 - Skip/Take 的东西必须在整个数据集上工作,对吧?这意味着所有 100K 行实际上都是从数据库中提取的?在 SQL 服务器中将“select * from anything”变成延迟加载没有什么神奇的......?
  • 没有。 Linq skip take 转换为 sql offset 和 fetch。无论如何在sql server中。不确定 sqllite。
  • 但仅适用于构建 SQL 的 Linq2Sql 等工具。如果您在存储过程或内联 SQL 中预定义了 SQL,则不会。像这样的 Linq 只能在 IEnumerable 等上运行。
  • 您可以参数化存储过程或一段sql中的偏移量。
  • 是的,谢谢 - 但这是一个非常重要的细节 :)。我认为这个问题的正确答案是你的第二段,即不要将那么多数据加载到 UI 中。现在,如果只有 MS 没有“抛弃”Linq2Sql...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2012-09-04
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多