WPF AutoCompleteBox Виртуализация данных
Я пытаюсь реализовать виртуализацию данных на автозаполнении WPF. Я нашел здесь код Bea Stollnitz, который отлично работает на ListView, и сделал так, чтобы он легко работал с ComboBox, но я никак не могу заставить его работать правильно на AutoCompleteBox.
Чтобы быть точным, это работает - список виртуализирован, элементы не все загружаются при запуске - но, по-видимому, происходит то, что AutoCompleteBox выполняет итерацию по всем элементам в списке, как только изменяется ItemsSource, и это приводит к разрушению целого вещь (т.е. при загрузке, все страницы в списке запрашиваются, поэтому, даже если они виртуализированы, все они будут запрошены в начале и будут загружены). Я предполагаю, что это происходит из-за фильтрации, которую выполняет ACBox, но я удивлен, что нет способа предотвратить это, так как элемент управления обычно позволяет выполнять фильтрацию на стороне сервера, используя событие Population.
Я чувствую, что что-то упускаю, я не могу поверить, что никто не делал что-то подобное раньше или что это невозможно, поэтому я предполагаю, что просто делаю что-то явно неправильное, что могу " не понимаю, так как я новичок в WPF.
Вот некоторые из вещей, которые я сделал, чтобы попытаться собрать их вместе (основываясь на поиске в интернете подобных проблем):
Я убедился, что все условия для встроенной виртуализации пользовательского интерфейса в порядке, включая явное включение, настройку максимальной высоты ListBox и т. Д.
Я заменил ListBox в AutoCompleteBox на ListView, подобный тому, который Bea использует в своем примере. Рядом, ListView сам по себе работает, как и ожидалось, но встроенный в ACBox нет.
Я пытался не использовать фильтрацию в ACBox, использовать пользовательский фильтр, обрабатывать заполненный вечер вручную и т. Д. Это не помогает. Создание пользовательского фильтра явно недостаточно, поскольку пользовательский фильтр позволяет указать только результат оценки одного элемента, код, который проходит по списку, не виден, поэтому вы не можете предотвратить его выполнение. Переключение фильтра на "Нет" также ничего не делает.
Любые предложения приветствуются!
Цель для этого -.NET 3.5, и я использую WPF Toolkit (выпуск от февраля 2010 г.)
Спасибо!
1 ответ
Я отследил это до OnItemsSourceChanged() (см. Источник). Там AutocompleteBox хранит "локальную кэшированную копию данных", поэтому я вижу поведение, отмеченное выше. Это частный метод, поэтому здесь нет необходимости его переопределять.
Мне кажется, что из-за этого вы не можете применить DataVirtualization к AutoCompleteBox, по крайней мере, не используя идеи в решении Bea. Если у кого-то есть какие-то другие мысли по этому поводу, я бы с удовольствием попробовал, но до тех пор, как я считаю, ответом будет.