WPF AutoCompleteBox数据虚拟化

时间:2011-08-01 17:38:14

标签: c# .net wpf autocompletebox data-virtualization

我正在尝试在WPF AutoCompleteBox上实现Data Virtualization。 我找到了Bea Stollnitz的代码here,它在ListView上工作得很好,我让它很容易在ComboBox上工作,但我似乎无法让它在AutoCompleteBox上运行。

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

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

以下是我尝试将这些内容融合在一起的一些事情(基于互联网搜索类似问题):

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

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

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

欢迎任何和所有建议!

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我将其跟踪到OnItemsSourceChanged()(参见source)。在那里,AutocompleteBox存储“数据的本地缓存副本”,这就是我看到上述行为的原因。 这是一种私有方法,所以不要在这里覆盖。

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