2011-01-05 3 views
2

В приложении WPF у меня есть ListView, связанный с ObservableCollection на моей модели ViewModel.Очистка ObservableCollection

Во время запуска приложения мне нужно удалить и перезагрузить все предметы в коллекции. Мне больше не нужно добавлять или удалять отдельные элементы.

Это вызывает вопрос, действительно ли ObservableCollection необходим, и могу ли я просто привязать ListView к IEnumerable и вызвать OnPropertyChanged при замене коллекции?

Поскольку ObservableCollection не имеет метода AddRange, единственным способом перезагрузки без замены коллекции было бы добавить каждый элемент по отдельности. Может ли это иметь какие-либо существенные последствия для производительности, поскольку CollectionChanged уволен за каждый добавленный элемент?

Наконец, поскольку я использую ICollectionView для синхронизации выбранного в данный момент элемента, если I сделать заменить коллекцию, мне нужно будет снова вызвать CollectionViewSource.GetDefaultView? Я предполагаю, что могу повторно использовать существующий обработчик CurrentChanged.

Благодаря Бен

+0

Я тестировал это раньше. ObservableCollection быстрее, чем List с уведомлением. – vorrtex

+0

@vorrtex - любая статистика, чтобы поддержать это? И это применимо в моем случае, когда я ищу замену всей коллекции? –

+0

Просто попробуйте сами, используя класс Секундомер. Проблема производительности существует только при отображении элементов, а количество элементов ничего не изменит из-за виртуализации пользовательского интерфейса. – vorrtex

ответ

4

Я бы сказал, ваша интуиция является правильным: если вы никогда не добавлять или удалять отдельные элементы, но всегда выгрузить весь список, и вы уверены, что это требование не изменится, тогда вам будет лучше не наблюдаемый список (или IEnumerable) и INotifyPropertyChanged.

Если списки велики, это даст вам некоторую скорость. Но большая выгода - читаемость: она будет более четко выражать ваше намерение. Следующий пользователь, который будет поддерживать ваш код, не будет работать, пытаясь найти весь код, который когда-либо мог бы добавлять и удалять элементы из ObservableCollection; они смогут быстро и ясно увидеть, что вы всегда меняете весь список.

1

Мой ответ зависит.

Если в вашей коллекции может быть более 10000 объектов, я скажу, что лучше избегать 10000 событий коллекции и заменить их одним измененным свойством.

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

Если вы решили использовать простой IEnumerable вам нужно попросить DefualtView каждый раз, когда изменения задания

Смежные вопросы