为什么虚拟ListBox请求旧的项目

本文关键字:项目 请求 虚拟 ListBox 为什么 | 更新日期: 2023-09-27 18:15:34

我有自己的DefferedList:IList类。I overrides

Count, IndexOf, this[]

成员和put

调试。WriteLine("Get " + index);

插入this[int index].

然后我将这个类的实例绑定到ListBox.ItemSource.

一切都很好,但UI虚拟化对我来说有点奇怪。我运行应用程序。ListBox由前17个项目填充(从0到17)。然后跳转到第200项

TheList.ScrollIntoView(Item200);

ListBox请求第200项,然后再次请求从0到16的项,最后请求184-209项。

那么为什么它再次请求0-16项,而它们不再可见?这严重影响了我的数据虚拟化性能。

如何避免?

为什么虚拟ListBox请求旧的项目

我有一些非常糟糕的经验,在使用标准ListBox中使用的自定义列表虚拟化的过程中浪费了大量的时间。我建议不要使用自定义列表,而是使用ObservableCollection。我认为ListBox可能主要是用ObservableCollection来测试的,你试图避免填充整个列表的任何技巧都可能适得其反,因为ListBox并不像你所期望的那样灵活,因为ItemsSource只是一个IEnumerable。实际上,基于这个期望-如果您想要显示项目200,您可以假设它需要枚举0到200之间的所有项目。

如果列表中有几百个项目—您可能希望简化数据模型以显示它们,因此您可以从一开始就使用所有项目填充ObservableCollection,并且仅在项目的内容被请求且尚未可用时加载项目数据。如果时间太长,你可以在加载数据之前添加一个小延迟,并在开始加载之前检查收集项视图在屏幕上是否可见。

如果你的ItemTemplate是预定义的尺寸,这可能会有帮助。