Почему ObservableCollection не поддерживает массовые изменения?

Каковы потенциальные проблемы, вызванные вспомогательными операциями ObservableCollection типа AddRange или RemoveRange? Должна быть причина, по которой Microsoft не предоставила их, теперь, когда ObservableCollection так часто используется с WPF.

Вы можете реализовать свою собственную коллекцию, которая поддерживает массовые операции и реализует INotifyCollectionChanged. Что произойдет, если я привяжу такой элемент управления к элементу ItemsControl?

Кто-нибудь знает о ItemsControls, которые не поддерживают массовые изменения?

Ответ 1

Я не думаю, что есть какие-то потенциальные недостатки или проблемы, просто потому, что их нет. Фактически вы обнаружите, что большинство типов в "System.Collections.Generic" не предоставляют функции "AddRange".

Между тем, многие люди создали свои собственные версии ObservableCollection, чтобы предоставить необходимую функциональность. По этой причине INotifyCollectionChanged содержит достаточную информацию для своих обработчиков, чтобы отметить, что, вероятно, по этой причине был затронут ряд элементов.

И последнее, но не менее важное: если вы привязываете коллекцию, которая имеет эти операции типа "Range", вы обнаружите, что они будут работать с вашим пользовательским интерфейсом, как вы ожидаете.

Ответ 2

Существует множество расширений для ObservableCollection, которые можно найти в Интернете, которые добавляют концепцию добавления/удаления диапазона, или позволяют вам откладывать обновления и запускать их вручную. Например, см. Этот вопрос о переполнении стека:

ObservableCollection Не поддерживает метод AddRange, поэтому я получаю уведомление для каждого добавленного элемента, помимо того, что касается INotifyCollectionChanging?

Вы также можете реализовать массовое добавление, которое вызывает событие reset, что приведет к тому, что пользовательский интерфейс повторно отобразит все элементы коллекции:

http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/

Это позволяет вам более эффективно управлять обновлениями пользовательского интерфейса. Как ItemsControl обрабатывает событие с измененной коллекцией, которое детализирует список измененных элементов, зависит от самой структуры WPF. Я предполагаю, что это разумно справляется с этим!

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

Ответ 3

NotifyCollectionChangedEventArgs содержит информацию об индексах. Удаление элементов приводит к перестановке индексов, равно как и вставка элементов. Следовательно, хотя это не совсем невозможно, было бы довольно сложно и, вероятно, неэффективно обеспечить способность работать с диапазонами.

Ответ 4

Должна быть причина, по которой Microsoft не предоставила их

Они не предоставляют все возможные функциональные возможности, это (также) стоимость и спрос.

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

Да. И когда вы это сделаете, вы обнаружите, что коллекция должна будет сделать выбор о том, как и когда следует распространять эти изменения. Я никогда не пробовал, но я полагаю, что есть некоторые компромиссы, которые View или ViewModel могут принимать более правильные решения, чем многоразовая коллекция.