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

时间:2011-11-23 12:51:45

标签: c# .net wpf windows-phone-7

我有自己的DefferedList:IList类。我超越了

  

Count,IndexOf,this []

成员并提出

  

Debug.WriteLine(“Get”+ index);

进入[int index]。

然后我将此类的实例绑定到ListBox.ItemSource。

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

TheList.ScrollIntoView(Item200);

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

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

如何避免它?

1 个答案:

答案 0 :(得分:0)

我在使用标准ListBox中使用的列表的自定义虚拟化方面浪费了大量时间浪费了很多时间。我建议不要使用自定义列表,而是使用ObservableCollection。我认为ListBox可能大部分都是使用ObservableCollection进行测试的,你试图制作的任何技巧都可以避免填充整个列表,因为ListBox并不像你想象的那样灵活,因为ItemsSource只是一个IEnumerable。实际上基于这种期望 - 如果你想显示项目200,你可以假设它需要枚举0到200之间的所有项目。

如果列表中有几百个项目 - 您可能希望简化数据模型以显示它们,因此您从头开始填充所有项目的ObservableCollection,并仅在项目内容时加载项目数据请求,但尚未提供。如果这太多了 - 您可以在加载数据之前添加一个小延迟,并在开始加载之前检查收集项目视图是否在该延迟之后在屏幕上可见。

如果您的ItemTemplate具有预定义的尺寸,那么另一件可能有用的事情就是。