Интерфейсы, относящиеся к привязке данных

С помощью ADO.NET можно создать различные структуры данных в соответствии с требованиями привязки приложения и данных, с которыми приходится работать. Можно создать собственные классы, которые предоставляют или используют данные в Windows Forms. Такие объекты могут предоставлять функциональные возможности и обеспечивать сложность различного уровня, такие как базовая привязка данных, поддержка на этапе разработки, проверка ошибок, уведомление об изменениях или даже поддержка структурированного отката изменений, внесенных в сами данные.

Потребители интерфейсов привязки данных

Ниже описаны две группы объектов интерфейса. В первую группу входят интерфейсы, реализованные на основе источников данных авторами источников данных. Такие интерфейсы предназначены для использования потребителями источников данных, которыми в большинстве случаев являются элементы управления или компоненты Windows Forms. Ко второй группе относятся интерфейсы, используемые авторами компонентов. Авторы компонентов используют эти интерфейсы при создании компонента, поддерживающего привязку данных, которую должен применять модуль привязки данных Windows Forms. Данные интерфейсы можно реализовать внутри классов, связанных с вашей формой, чтобы обеспечить привязку данных. Каждый вариант представляет класс, реализующий интерфейс, позволяющий взаимодействовать с данными. Такие возможности уже применяются в средствах быстрой разработки приложений (RAD) Visual Studio.

Интерфейсы для реализации авторами источников данных

Следующие интерфейсы предназначены для использования элементами управления Windows Forms.

  • IList Интерфейс

    Класс, реализующий интерфейс IList, может являться Array, ArrayList или CollectionBase. Они представляют собой индексированные списки элементов типа Object. Эти списки должны содержать однородные типы, так как первый элемент индекса определяет тип. IList будет доступен для привязки только во время выполнения.

    Примечание.

    Если требуется создать список бизнес-объектов для привязки с помощью Windows Forms, рекомендуется использовать класс BindingList<T>. BindingList<T> представляет собой расширяемый класс, реализующий основные интерфейсы, необходимые для двусторонней привязки данных в Windows Forms.

  • IBindingList Интерфейс

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

    Примечание.

    Уведомление об изменениях включается для интерфейса IBindingList с помощью свойства SupportsChangeNotification, которое, если равно true, вызывает событие ListChanged, указывая, что изменен список или элемент в списке.

    Тип изменения описывается свойством ListChangedType параметра ListChangedEventArgs. Следовательно, при любом обновлении модели данных все зависимые представления, например другие элементы управления, привязанные к тому же источнику данных, также будут обновлены. Однако объекты, содержащиеся в списке, должны уведомлять список о своем изменении, чтобы список мог создать событие ListChanged.

    Примечание.

    BindingList<T> предоставляет универсальную реализацию интерфейса IBindingList.

  • IBindingListView Интерфейс

    Класс, реализующий интерфейс IBindingListView, предоставляет все функциональные возможности реализации класса IBindingList, а также функции фильтрации и сложной сортировки. Такая реализация обеспечивает фильтрацию на основе строк и сортировку по нескольким столбцам с помощью пары "дескриптор свойства-направление".

  • IEditableObject Интерфейс

    Класс, реализующий интерфейс IEditableObject, позволяет объекту обеспечивать управление после того, как изменения в данном объекте становятся постоянными. Данная реализация предоставляет методы BeginEdit, EndEdit и CancelEdit, позволяющие выполнять откат изменений, внесенных в объект. Ниже приведено краткое объяснение работы методов BeginEdit, EndEdit и CancelEdit и принципов их работы в сочетании друг с другом для обеспечения отката изменений, внесенных в данные.

    • Метод BeginEdit передает сигнал о начале внесения изменения в объект. Объект, реализующий этот интерфейс, должен будет сохранять все обновления после вызова метода BeginEdit, чтобы их можно было отменить в случае вызова метода CancelEdit. При привязке данных в Windows Forms метод BeginEdit можно вызвать несколько раз в области одиночной транзакции изменения (например, BeginEdit, BeginEdit, EndEdit). Реализации IEditableObject должны следить за тем, был ли уже вызван метод BeginEdit, и игнорировать последующие вызовы в BeginEdit. Поскольку этот метод может быть вызван несколько раз, важно, чтобы последующие вызовы были неразрушающими. То есть последующие вызовы BeginEdit не могут удалить уже сделанные обновления или изменить данные, сохраненные при первом вызове BeginEdit.

    • Метод EndEdit отправляет в базовый объект все изменения после вызова BeginEdit, если данный объект находится в режиме редактирования.

    • Метод CancelEdit отклоняет все изменения, внесенные в объект.

    Дополнительные сведения о том, как работают методы BeginEdit, EndEdit и CancelEdit, см. в разделе Сохранение данных обратно в базу данных.

    Такой транзакционный характер функциональных возможностей данных используется элементом управления DataGridView.

  • ICancelAddNew Интерфейс

    Класс, реализующий интерфейс ICancelAddNew, обычно реализует интерфейс IBindingList и позволяет выполнять откат добавлений, сделанных в источнике данных с помощью метода AddNew. Если источник данных реализует интерфейс IBindingList, он также должен реализовать интерфейс ICancelAddNew.

  • IDataErrorInfo Интерфейс

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

    • Свойство Error возвращает общее сообщение об ошибке (например, "Произошла ошибка").

    • Свойство Item[] возвращает строку с конкретным сообщением об ошибке из столбца (например, "Недопустимое значение в столбце State").

  • IEnumerable Интерфейс

    Класс, реализующий интерфейс IEnumerable, обычно используется в ASP.NET. Поддержка Windows Forms для этого интерфейса доступна только через компонент BindingSource.

    Примечание.

    Компонент BindingSource копирует все элементы IEnumerable в отдельный список, предназначенный исключительно для привязки.

  • ITypedList Интерфейс

    Класс коллекций, реализующий интерфейс ITypedList, позволяет управлять порядком и задавать свойства, предоставляемые привязанному элементу управления.

    Примечание.

    Если вы реализуете метод GetItemProperties и массив PropertyDescriptor не является пустым, последняя запись в массиве будет дескриптором свойства, описывающим свойство списка, которое является другим списком элементов.

  • ICustomTypeDescriptor Интерфейс

    Класс, реализующий интерфейс ICustomTypeDescriptor, предоставляет динамические сведения о себе. Этот интерфейс аналогичен ITypedList, но используется для объектов, а не для списков. DataRowView использует этот интерфейс для проецирования схемы основных строк. Класс CustomTypeDescriptor предоставляет простую реализацию ICustomTypeDescriptor.

    Примечание.

    Для поддержки привязки с типами на этапе разработки, реализующими ICustomTypeDescriptor, тип также должен реализовать IComponent и существовать в качестве экземпляра формы.

  • IListSource Интерфейс

    Класс, реализующий интерфейс IListSource, позволяет выполнять привязку на основе списка для объектов, не входящих в список. Метод GetList интерфейса IListSource используется для возврата привязываемого списка из объекта, который не является производным от IList. IListSource используется классом DataSet.

  • IRaiseItemChangedEvents Интерфейс

    Класс, реализующий интерфейс IRaiseItemChangedEvents, — это привязываемый список, который также реализует интерфейс IBindingList. Этот интерфейс позволяет определить, вызывает ли ваш тип события ListChanged типа ItemChanged через свое свойство RaisesItemChangedEvents.

    Примечание.

    Вы должны реализовать IRaiseItemChangedEvents, если ваш источник данных выполняет описанное ранее преобразование свойств в события списка и взаимодействует с компонентом BindingSource. В противном случае BindingSource также будет выполнять преобразование свойства в событие списка, что ухудшит производительность.

  • ISupportInitialize Интерфейс

    Компонент, реализующий интерфейс ISupportInitialize, использует возможности пакетной оптимизации для настройки свойств и инициализации взаимозависимых свойств. ISupportInitialize содержит два метода:

    • BeginInit подает сигнал объекту о начале инициализации.

    • EndInit подает сигнал объекту о завершении инициализации.

  • ISupportInitializeNotification Интерфейс

    Компонент, реализующий интерфейс ISupportInitializeNotification, также реализует интерфейс ISupportInitialize. Этот интерфейс позволяет уведомлять другие компоненты ISupportInitialize о завершении инициализации. Интерфейс ISupportInitializeNotification содержит два элемента:

    • IsInitialized возвращает значение boolean, показывающее, инициализирован ли компонент.

    • Initialized возникает при вызове метода EndInit.

  • INotifyPropertyChanged Интерфейс

    Класс, реализующий этот интерфейс, представляет собой тип, который вызывает событие при изменении любого значения его свойств. Этот интерфейс предназначен для замены шаблона, в рамках которого имеется отдельное событие изменения для каждого свойства элемента управления. В случае использования в BindingList<T> бизнес-объект должен реализовать интерфейс INotifyPropertyChanged, а BindingList`1 будет преобразовывать события PropertyChanged в события ListChanged типа ItemChanged.

    Примечание.

    Чтобы в привязке между связанным клиентом и источником данных происходило уведомление об изменении, тип вашего привязанного источника данных должен либо реализовывать интерфейс INotifyPropertyChanged (предпочтительно), либо вы можете предоставлять события propertyNameChanged для привязанного типа, но не следует использовать оба варианта.

Интерфейсы для реализации авторами компонентов

Перечисленные ниже интерфейсы предназначены для использования модулем привязки данных в Windows Forms.

  • IBindableComponent Интерфейс

    Класс, реализующий этот интерфейс, является компонентом без элемента управления, который поддерживает привязку данных. Этот класс возвращает привязки данных и контекст привязки компонента через свойства DataBindings и BindingContext этого интерфейса.

    Примечание.

    Если данный компонент наследуется от Control, интерфейс IBindableComponent реализовывать не нужно.

  • ICurrencyManagerProvider Интерфейс

    Класс, реализующий интерфейс ICurrencyManagerProvider, является компонентом, предоставляющим свой собственный CurrencyManager для управления привязками, связанными с данным конкретным компонентом. Доступ к пользовательскому CurrencyManager предоставляется свойством CurrencyManager.

    Примечание.

    Класс, который наследует от Control, автоматически управляет привязками через свое свойство BindingContext, поэтому ситуации, когда необходимо реализовать ICurrencyManagerProvider, довольно редки.

См. также