Общие сведения об источниках привязки

Обновлен: Ноябрь 2007

В привязке данных объект источника привязки (источник) ссылается на объект, из которого вы получаете данные. В этом разделе обсуждаются типы объектов, которые можно использовать в качестве источника.

В этом разделе содержатся следующие подразделы.

  • Источник привязки
  • Использование класса среды CLR в качестве объекта источника привязки
  • Целые объекты, используемые в качестве источника привязки
  • Объекты коллекции, используемые в качестве источника привязки
  • Требования разрешения
  • Связанные разделы

Источник привязки

Привязка данных Windows Presentation Foundation (WPF) поддерживает следующие типы источника привязки:

Источник привязки

Описание

Объекты среда CLR (common language runtime)

Можно осуществить привязку к открытым свойствам, подсвойствам, а также индексаторам любого объекта среда CLR (common language runtime). Обработчик привязки использует отражение CLR для получения значений свойств. Кроме того, объекты, которые реализуют ICustomTypeDescriptor или имеют зарегистрированные TypeDescriptionProvider, также работают с обработчиком привязки.

См. следующий раздел для получения дополнительных сведений о реализации класса, который может служить объектом-источником.

Данные ADO.NET

Можно осуществлять привязку к объектам ADO.NET, таким как DataTableDataView ADO.NET реализует IBindingList, предоставляющий уведомления об изменениях, которые ожидает обработчик привязки.

Пример см. в разделе Пример привязки к DataSet ADO.NET.

Данные XML

Можно осуществлять привязку и выполнение XPath запросов в XmlNode или XmlDocumentXmlElement. Удобный способ доступа к данным XML, которые являются источником привязки в разметке заключается в использовании объекта XmlDataProvider. Дополнительные сведения см. в разделе Практическое руководство. Привязка к данным xml с помощью XMLDataProvider и запросов XPath.

Также можно осуществлять привязку к XElement или XDocument или привязку к результатам запросов, выполняемых на объектах этих типов с помощью LINQ для XML. Удобный способ доступа к данным XML, которые являются источником привязки в разметке, заключается в использовании объекта XmlDataProvider. Дополнительные сведения см. в разделе Практическое руководство. Привязка к XDocument, XElement или LINQ для результатов запросов XML.

DependencyObject

Можно осуществить привязку к свойствам зависимости любого DependencyObject. Пример см. в разделе Как привязать свойства двух элементов управления.

Использование класса среды CLR в качестве объекта источника привязки

В этом разделе рассматриваются вопросы, которые нужно знать, если реализуется класс CLR, чтобы использовать его в качестве объекта источника.

Предоставление уведомлений об изменениях

Если вы используете либо привязкуOneWay, либо привязкуTwoWay (вам требуется обновлять Пользовательский интерфейс при динамическом изменении свойств источника), то вам необходимо реализовать подходящий механизм уведомления изменений свойств. Рекомендуемым механизмом для класса CLR является реализация интерфейса INotifyPropertyChanged. Дополнительные сведения см. в разделе Практическое руководство. Реализация уведомления об изменении свойства.

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

Если ваш объект источника реализует собственный механизм уведомления, нужные обновления происходят автоматически. Если по какой-либо причине ваш исходный объект не обеспечивает соответствующие уведомления об измененных свойствах, у вас имеется возможность использовать метод UpdateTarget для обновления нужного свойства явным образом.

Другие характеристики

Ниже приведены другие важные моменты:

  • Если вам требуется создать объект в XAML, класс должен иметь конструктор по умолчанию. В некоторых языках NET, таких как C#, конструктор по умолчанию может быть уже создан для вас.

  • Свойства, которые вы используете как в качестве свойств источника для привязки, должны быть открытыми свойствами класса. Явно определенные свойства интерфейса не могут использоваться для целей привязки, также как и защищенные, закрытые или виртуальные свойства, не имеющие базовой реализации.

  • Можно осуществлять привязку к открытым полям класса CLR.

  • Тип свойства, объявленного в вашем классе, является типом, передаваемым привязке. Однако тип используемой привязки в конечном счете зависит от типа свойства цели привязки, а не свойства источника. Если есть разница в типе, вам может потребоваться написать преобразователь для обработки того, как ваше пользовательское свойство по умолчанию передается привязке. Дополнительные сведения см. в разделе IValueConverter.

Целые объекты, используемые в качестве источника привязки

Вы можете использовать весь объект в качестве источника для привязки. Это может быть сделано путем указания объекта в качестве источника привязки с помощью свойства Source или DataContext, и затем не предоставляя пути за пределами объявления пустой привязки: {Binding}. Сценарии, в которых это полезно, включают привязку к объектам строкового типа, привязку к объектам с несколькими интересующими вас свойствами или привязку к коллекции объектов. Пример привязки к целому объекту коллекции содержится в разделе Практическое руководство. Использование шаблона "основной-подчиненный" с иерархическими данными.

Обратите внимание, что вам, возможно, потребуется применить пользовательскую логику, чтобы данные были применимы к вашему привязанному свойству цели. Пользовательская логика может быть в виде пользовательского преобразователя (если не существует преобразования типа по умолчанию) или DataTemplate. Дополнительные сведения о преобразователях, см. в подразделе "Преобразование данных" раздела Общие сведения о связывании данных. Дополнительные сведения о шаблонах данных см. в разделе Общие сведения о шаблонах данных.

Объекты коллекции, используемые в качестве источника привязки

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

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

WPF предоставляет класс ObservableCollection<T>, который является встроенной реализацией коллекции данных, предоставляющей интерфейс INotifyCollectionChanged. Отдельные объекты данных в коллекции должны удовлетворять требованиям, описанным в разделах выше. Пример см. в разделе Практическое руководство. Создание и привязка коллекции "ObservableCollection". До реализации собственной коллекции рассмотрите возможность использования класса ObservableCollection<T> или одного из существующих классов коллекций, таких как List<T>, Collection<T> и BindingList<T> (среди многих прочих).

WPF никогда не реализует прямую привязку к коллекции. Если в качестве источника данных указана коллекция, WPF выполняет привязку фактически к представлению по умолчанию коллекции. Сведения о представлениях по умолчанию см. в разделе Общие сведения о связывании данных.

Если имеется расширенный сценарий и требуется реализовать свою собственную коллекцию, следует рассмотреть возможность использования IList, которая предоставляет коллекцию объектов, к которым можно по отдельности обращаться по индексу и следовательно, максимально быстро.

Требования разрешения

В следующей таблице перечислено, какие типы свойств могут быть привязаны в приложении, выполняющемся либо при полном доверии, либо при частичном доверии:

Тип свойства

(все модификаторы доступа)

Свойство CLR

Свойство среды CLR

Свойство зависимости

Зависимость

свойство

Уровень доверия

Полное доверие

Частичное доверие

Полное доверие

Частичное доверие

Открытый класс

Да

Да

Да

Да

Закрытый класс

Да

Нет

Да

Да

В этой таблице описаны следующие важные моменты для требований разрешений в привязке данных:

  • Для свойств CLR привязка данных работает, пока для обработчика привязки возможен доступ к свойству источника с помощью отражения. В противном случае обработчик привязки выдает предупреждение о том, что свойство не найдено, и использует запасное значение или значение по умолчанию, если оно доступно.

  • Всегда можно осуществить привязку к свойствам зависимости.

Требование разрешения для привязки XML то же: в изолированной зоне частичного доверия происходит сбойXmlDataProvider, когда у него нет разрешений для доступа к предоставляемым данным.

Дополнительные сведения о безопасности частичного доверия содержатся в разделе Безопасность частичного доверия Windows Presentation Foundation.

См. также

Задачи

Практическое руководство. Указание источника привязки

Основные понятия

Общие сведения о связывании данных

Общие сведения о связывании с данными в WPF с помощью LINQ to XML

Оптимизация производительности: привязка данных

Ссылки

ObjectDataProvider

XmlDataProvider

Другие ресурсы

Практические руководства по привязке данных