1

我正在尝试在 WPF AutoCompleteBox 上实现数据虚拟化。我在这里找到了 Bea Stollnitz 的代码,它在 ListView 上工作得很好,而且我很容易让它在 ComboBox 上工作,但我似乎无法让它在 AutoCompleteBox 上正常工作。

准确地说,它是有效的——列表是虚拟化的,项目并不是在启动时全部加载——但似乎发生的是,一旦 ItemsSource 发生变化,AutoCompleteBox 就会遍历列表中的所有项目,这最终会破坏整个事情(即在加载时,列表中的所有页面都被请求,因此即使它们被虚拟化,它们也会在开始时被请求并被加载)。我的猜测是这是因为 ACBox 进行了过滤,但我很惊讶没有办法阻止它,因为控件通常允许使用 Populating 事件在服务器端进行过滤。

我觉得我错过了一些东西,我不敢相信以前没有人做过这样的事情或者无法做到,所以我猜我只是在做一些我可以做的明显错误的事情不知道,因为我是 WPF 的新手。

以下是我为尝试将其整合在一起所做的一些事情(基于围绕类似问题的 Internet 搜索):

  • 我确保内置 UI 虚拟化的所有条件都可以,包括显式打开它、设置 ListBox 的最大高度等。

  • 我用 Bea 在她的示例中使用的 ListView 替换了 AutoCompleteBox 中的 ListBox。并排地,ListView 本身按预期工作,但嵌入在 ACBox 中的却没有。

  • 我尝试在 ACBox 中不使用过滤,使用自定义过滤器,手动处理填充事件等。这没有帮助。制作自定义过滤器显然是不够的,因为自定义过滤器只允许您指定评估一项的结果,循环遍历列表的代码是不可见的,因此您无法阻止循环。将过滤器设置为“无”也无济于事。

欢迎任何和所有建议!

目标是 .NET 3.5,我正在使用 WPF 工具包(2010 年 2 月发布)

谢谢!

4

1 回答 1

0

我将此追踪到 OnItemsSourceChanged() (请参阅源代码)。在那里,AutocompleteBox 存储了“数据的本地缓存副本”,这就是我看到上述行为的原因。这是一个私有方法,所以这里没有覆盖。

在我看来,因此您不能将 DataVirtualization 应用于 AutoCompleteBox,至少不使用 Bea 解决方案中的想法。如果有人对此有任何不同的想法,我很想尝试一下,但在那之前,这就是我相信的答案。

于 2011-08-26T13:14:49.383 回答