Почему ObservableCollection не поддерживает массовые изменения? - PullRequest
11 голосов
/ 05 марта 2012

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

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

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

Ответы [ 4 ]

4 голосов
/ 05 марта 2012

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

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

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

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

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

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

3 голосов
/ 05 марта 2012

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

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

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

2 голосов
/ 05 марта 2012

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

1 голос
/ 05 марта 2012

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

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

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

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

...