Очистка ObservableCollection - PullRequest
       2

Очистка ObservableCollection

2 голосов
/ 06 января 2011

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

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

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

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

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

Спасибо Бен

Ответы [ 2 ]

4 голосов
/ 06 января 2011

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

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

1 голос
/ 06 января 2011

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

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

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

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

...