2013-03-06 5 views
2

Я хочу иметь класс коллекции модели домена и класс модели представления, который только отражает и проектирует элементы модели домена, но сам по себе доступен только для чтения.Сопоставление данных с типом INotifyCollectionChanged

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

Вопрос: реализует INotifyCollectionChanged, достаточный для включения привязки данных WPF, например. DataGrid или ListView или какой минимальный набор интерфейсов необходим для создания привязки данных на основе коллекции?

ответ

4

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

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

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

Edit:

Ниже берут от Microsoft;

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

WPF предоставляет ObservableCollection(Of T) класса, который является встроенным осуществления сбора данных, который предоставляет интерфейс к INotifyCollectionChanged.

Обратите внимание, что для полной поддержки передачи значений данных из исходных объектов для целей, каждый объект в вашей коллекции, который поддерживает связываемое свойство также должно реализовать интерфейс INotifyPropertyChanged.

Перед реализацией собственной коллекции, рассмотреть возможность использования ObservableCollection(Of T) или один из существующих классов коллекций, таких как List(Of T), Collection(Of T) и BindingList(Of T), среди многих других. Если у вас есть расширенный сценарий и вы хотите реализовать свою собственную коллекцию, рассмотрите возможность использования IList, который предоставляет универсальную коллекцию объектов, которые могут быть индивидуально доступны по и, следовательно, наилучшей производительностью.

С ..

http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections

+2

Интересно.Модели представления элементов (пока) неизменны в любом случае. Я не мог видеть модель представления, отображаемую в представлении, но затем я внедрил IEnumerable, и это сделало трюк. Основной момент реализации минимального набора интерфейсов состоял в том, чтобы обеспечить режим только для чтения. Количество элементов будет очень низким (<100), поэтому производительность не будет проблемой. –

Смежные вопросы