@rFczZZ

Нужен ли INotifyCollectionChanged для коллекций если я его не использую?

Подскажите, например, для ItemsControl: если я унаследую коллекцию от INotifyCollectionChanged - будет ли он действительно бережно обрабатывать все NotifyCollectionChangedEventArgs.Action или можно отправлять его пустым, надесь, что контейнеры для уже отрисованных элементов не будут пересозданы?

Аналогично, если я унаследую коллекцию только от INotifyPropertyChanged - будет ли ItemsControl следить за ссылками на элементы, создавая контейнеры только для новых объектов?

Конечно, возможно, я неправильно понимаю механизм построения "визуального дерева". Т.е. если внутреннее состояние коллекции изменилось - все нужно удалить, создать новые контейнеры и нарисовать их. Если в ItemsControl (например) есть механизм который сравнивает ссылки и не пересоздает контейнеры для старых объектов, то выходит, что INotifyCollectionChanged ему и не нужнен и он, действительно, на него не смотрит?

* добавлено:
А, что будет если туда положить только IEnumerable? Т.е. если сам объект коллекции изменен (в этом случае никакой коллекции то и нет), но элементы остались преждними, произойдет ли "моргание" с очисткой всех внутренних состояний в контейнерах элементов?
  • Вопрос задан
  • 384 просмотра
Решения вопроса 1
@Sumor
Если хотите что-то проверить - создайте простой тестовый проект и посмотрите.

Если у вас объекты реализуют INotifyPropertyChanged, то даже если они были привязаны к ItemsControl с помощью IEnumerable, привязанные (Binding) свойства в шаблоне обновятся. Они не пересоздадутся целиком, а именно обновятся те свойства, которые зависят от изменённых свойств вашего объекта. Например
<ItemsControl>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
         <TextBlock Text="{Binding Text}" Foreground="{Binding ForeColor}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

При изменении свойства Text вашего объекта обновится текст элемента. При изменении цвета - обновится цвет.

Но если вы в ItemsSource кладёте IEnumerable, то изменения собственно коллекции не отслеживаются. ни добавление, ни удаление. Если у вас изменилась коллекция вам нужно переприсваивать её заново и тогда будут заново созданы все визуальные элементы.
Для отслеживания изменения коллекции она должна реализовывать INotifyCollectionChanged. Вы можете за основу взять коллекции ObservableCollection<> - они уже реализуют необходимые события.
Соответственно, если в NotifyCollectionChanged будет указано, что добавился элемент - только он и отрисуется. Если элемент удалён - он и будет удалён. Остальные элементы не будут затронуты.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы