LongListSelector 数据虚拟化

7
LongListSelector是否支持数据虚拟化?我在几个博客上看到说它支持,但是我无法让它正常工作。
下面是我的尝试过程:我提供了一个IList实现作为List的ItemsSource。问题是List调用GetEnumerator()而不是this[int index]来获取列表项。
所以我的问题是:如何为LongListSelector实现数据虚拟化?

您希望在群组上还是所有项目上进行数据虚拟化? - Claus Jørgensen
在群组中,包含了项目。因此LongListSelector应该读取尽可能多的群组和项目,直到它拥有足够的群组和项目。 - thumbmunkeys
1
是的,但您应该记住LongListSelector使用嵌套集合进行数据显示。因此,您很可能需要对内部和外部集合进行虚拟化。 - Claus Jørgensen
@claus:感谢您的快速回答。您能提供一个示例来说明这将如何工作吗?在我的程序中,每个组包含一系列项目。这是虚拟化的正确数据结构吗? - thumbmunkeys
2
不行。因为正如你所说,即使在呈现IList类型时,LongListSelector仍然基于GetEnumerator。最有可能需要重新编写控件以支持此目的。虽然博客可能会说它支持它,但它们中没有一个说明了如何做到这一点,因此我不倾向于相信它们。 LongListSelector的默认设置是呈现所有项目。例如,100,000个项目可以立即呈现,因此我不认为需要数据虚拟化。 - Claus Jørgensen
@Claus:100.00个项目瞬间渲染?在您的手机上还是在模拟器上 ;) 无论如何,在大多数情况下,渲染不是昂贵的操作,因为还有UI虚拟化,只会渲染必要的内容。但是从文件或数据库中获取100.00个项目需要时间。总之,我认为你是对的,“LongListSelector”可能不是“数据可虚拟化”的。请把您的最后一条评论作为答案,谢谢! - thumbmunkeys
2个回答

5
正如你所说,即使在呈现IList类型时,LongListSelector仍然基于GetEnumerator。很可能需要重新编写控件以支持此目的。虽然博客可能会说它支持它,但它们中没有一个说如何做到,因此我不倾向于相信它们。LongListSelector的默认设置是呈现所有项目。
至于数据的加载,可以使用ObservableCollection逐步完成。我有一个示例项目展示了如何将ObservableCollection与LongListSelector组合使用。
基本上,这可以让您逐步添加更多的组和/或更多的数据到组中,并且UI应相应地更新。

示例项目链接,访问被拒绝。 - Derek Beattie
现在已经在 GitHub 上了。链接已经修复。 - Claus Jørgensen
4
嗯,现在这个示例项目已经不存在了。 - swinefeaster

1

我查看了LongListSelector源代码,发现无法虚拟化后备存储。LongListSelector通过foreach循环从组列表中加载每个项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接