Является ли привязка ItemsControl к ObservableCollection <T>более эффективной, чем List <T>? - PullRequest
3 голосов
/ 12 июля 2010

У меня есть шаблон элемента рендеринга в ItemsControl, и я хочу минимизировать повторное использование шаблонов дочерних элементов, когда ItemsSource сигнализирует об изменении. Мне интересно, может ли, потому что ObservableCollection может точно сказать WPF, что изменилось (в отличие от всего списка), является ли он более эффективным при отображении изменений в коллекции, или если WPF достаточно умен, чтобы повторно использовать предыдущие представления элементов, если обнаруживает, что тот же элемент все еще находится в измененном списке.

Ответы [ 2 ]

4 голосов
/ 12 июля 2010

Ваше подозрение верно. WPF не будет повторно использовать предыдущие представления. Если вы замените ItemsSource для ItemsControl новым List, он создаст совершенно новые представления для каждого элемента в списке, даже если те же элементы были в старом списке.

Вы можете проверить это самостоятельно, поместив пользовательский элемент управления в ItemTemplate и добавив точку останова или ведение журнала отладки в его конструктор. Если вы замените ItemsSource идентичным списком, вы увидите, что ваш элемент управления создается один раз для каждого элемента в списке. С другой стороны, когда элемент добавляется в коллекцию ObservableCollection, вы увидите, что он вызывается только один раз.

Обратите внимание, что ItemsControl может повторно использовать контейнер (например, ListBoxItem), если вы используете панель виртуализации и у вас включена утилизация контейнера. См. http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx. Однако он не может повторно использовать содержимое контейнера.

0 голосов
/ 12 июля 2010

ObservableCollection только сообщает о добавлении и удалении объектов - поэтому, возможно, не так точно, как вы ожидали (если объект в списке изменяется, ObservableCollection не будет запускать какие-либо уведомления).

...