【发布时间】: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