Виртуализация данных WPF AutoCompleteBox

Я пытаюсь реализовать виртуализацию данных в WPF AutoCompleteBox. Я нашел код Bea Stollnitz здесь, который отлично работает в ListView, и я сделал его для легко работать с ComboBox, но я никак не могу заставить его работать правильно с AutoCompleteBox.

Если быть точным, это работает — список виртуализируется, не все элементы загружаются при запуске — но, похоже, происходит то, что AutoCompleteBox выполняет итерацию по всем элементам в списке, как только изменяется ItemsSource, и это приводит к нарушению всего вещь (т. е. при загрузке запрашиваются все страницы в списке, поэтому, даже если они виртуализированы, все они будут запрошены в начале и загружены). Я предполагаю, что это из-за фильтрации, которую делает ACBox, но я удивлен, что нет способа предотвратить это, поскольку элемент управления обычно позволяет выполнять фильтрацию на стороне сервера с помощью события Populating.

Я чувствую, что что-то упускаю, я не могу поверить, что никто не делал что-то подобное раньше или что это невозможно сделать, поэтому я предполагаю, что просто делаю что-то явно неправильное, что я могу». не могу понять, так как я новичок в WPF.

Вот некоторые из вещей, которые я сделал, чтобы попытаться собрать это вместе (на основе поиска в Интернете похожих проблем):

  • Я убедился, что все условия для встроенной виртуализации пользовательского интерфейса в порядке, включая ее явное включение, установку максимальной высоты ListBox и т. д.

  • Я заменил ListBox в AutoCompleteBox на ListView, подобный тому, который Беа использует в своем примере. Наряду с этим ListView сам по себе работает, как и ожидалось, а встроенный в ACBox — нет.

  • Я пытался не использовать фильтрацию в ACBox, используя пользовательский фильтр, вручную обрабатывать события заполнения и т. д. Это не помогает. Создание пользовательского фильтра, очевидно, недостаточно, поскольку пользовательский фильтр позволяет указать только результат оценки одного элемента, код, который зацикливается на списке, не виден, поэтому вы не можете предотвратить зацикливание. Включение фильтра в None также ничего не делает.

Любые и все предложения приветствуются!

Целью для этого является .NET 3.5, и я использую набор инструментов WPF (выпуск от февраля 2010 г.)

Спасибо!


person Alex Florescu    schedule 01.08.2011    source источник
comment
Примечание. Как ни странно (хотя это кажется несвязанным), виртуализация пользовательского интерфейса не работала, пока я не установил MaxHeight ListBox/View в коде C#. Когда я ранее установил его в XAML, это не сработало. Но это не помогло решить главную проблему.   -  person Alex Florescu    schedule 03.08.2011
comment
Могу я узнать, как вы смогли заставить это работать с Combobox? Любые указатели будут оценены   -  person Signcodeindie    schedule 07.09.2011
comment
@Signcodeindie Это довольно просто, я только что работал на примере Беа со списком. В самом простом случае вы просто назначаете AsyncVirtualizingCollection для ItemsSource ComboBox, что будет работать, но вам нужно немного больше стилей, чтобы он действительно выглядел и чувствовал себя правильно (но вы можете почти просто скопировать/вставить стиль в ее примере). Если у вас возникли проблемы с этим, возможно, стоит открыть новый вопрос, чтобы получить помощь по этому вопросу.   -  person Alex Florescu    schedule 14.09.2011


Ответы (1)


Я отследил это до OnItemsSourceChanged() (см. источник). Там AutocompleteBox хранит «локальную кэшированную копию данных», поэтому я вижу поведение, указанное выше. Это частный метод, поэтому здесь нет переопределения.

Мне кажется, что из-за этого нельзя применить DataVirtualization к AutoCompleteBox, по крайней мере, не используя идеи решения Bea. Если у кого-то есть другие мысли по этому поводу, я бы хотел попробовать, но до тех пор я считаю, что это ответ.

person Alex Florescu    schedule 26.08.2011