WPF ListBox VirtualizingStackPanel.VirtualizationMode = "Переработка" приводит к тому, что одни и те же элементы списка всегда появляются - PullRequest
5 голосов
/ 04 февраля 2011

Я использую WPF / .NET 4, и когда я добавляю свойство VirtualizingStackPanel.VirtualizationMode = "Recycling" в свои ListBoxes, оно вызывает многократное повторение одних и тех же элементов списка при прокрутке. Например, скажем, у меня есть ListBox со 100 элементами и 10 видны одновременно. При первой загрузке ListBox я вижу элементы 1–10, но когда я начинаю прокручивать вниз, чтобы увидеть оставшиеся элементы 11–100, элементы 1–10 повторяются снова и снова при прокрутке вниз, поэтому я не могу просматривать элементы 11 - 100. Если я переключаю Recycling обратно на Standard, то все работает правильно, но прокрутка идет ужасно медленно (мои ListItems довольно сложные, с несколькими изображениями, текстовыми полями и кнопками в них). Когда функция «Переработка» включена, прокрутка выполняется очень быстро, но я могу просматривать только пункты 1–10. Есть идеи о том, что не так или как это исправить? Заранее спасибо.

1 Ответ

6 голосов
/ 06 июля 2011

Режим рециркуляции работает, как следует из названия, путем повторного использования визуализированных ListBoxItems. Когда элемент ListBox больше не требуется для отображения элемента, который был прокручен вне списка, ListBox будет использовать его повторно для отображения элемента, который был прокручен.

Чтобы изменить то, что показывает ListBoxItem, ListBox просто устанавливает свое свойство DataContext для нового элемента. Для этого необходимо, чтобы содержимое ListBoxItem правильно реагировало на события DataContextChanged. Если вы используете только привязку данных для заполнения элементов управления, это произойдет автоматически. Но если, как следует из вашего комментария, вы используете какой-то код для обновления свойств, то вам нужно убедиться, что ваш код обработки событий выполняет свою работу.

...