WPF AutoCompleteBox Виртуализация данных - PullRequest
1 голос
/ 01 августа 2011

Я пытаюсь внедрить виртуализацию данных в WPF AutoCompleteBox. Я нашел код 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 Ответ

0 голосов
/ 26 августа 2011

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

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

...