我正在尝试在 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 月发布)
谢谢!