Сопровождение транзакций в наблюдаемой коллекции - PullRequest
3 голосов
/ 12 февраля 2010

Меня интересует наиболее эффективный способ изменения наблюдаемой коллекции таким образом, чтобы вызывалось только одно измененное свойство. Допустим, я хочу заполнить список 3-мя элементами, нет метода addCollection или чего-то в этом роде, поэтому я должен сделать clear + 3 раза add. Нужно ли создавать другую наблюдаемую коллекцию и назначать ее? Или какие техники используют другие?

1 Ответ

2 голосов
/ 12 февраля 2010
Класс

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

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

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

Конечно, есть ситуации, в которых столь же легко заменить ObservableCollection на новый. Иногда это будет намного менее эффективно, чем цикл Add (), потому что обработчики событий и CollectionViews перестраиваются. В других случаях это будет более эффективно, если коллекция велика, и ваш цикл добавляет только несколько элементов за раз. А иногда это вообще не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...