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

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

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

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

Источник привязки Description
объекты среды CLR Вы можете выполнять привязку к открытым свойствам, подсвойствам, а также индексаторам любого объекта CLR. Обработчик привязки использует отражение CLR для получения значений свойств. С обработчиком привязки также работает объект, который реализует ICustomTypeDescriptor или зарегистрировал TypeDescriptionProvider.

Дополнительные сведения о том, как реализовать класс, который можно использовать в качестве источника привязки, см. в разделе Использование класса в качестве источника привязки.
динамические объекты Вы можете выполнить привязку к доступным свойствам и индексаторам объекта, реализующего интерфейс IDynamicMetaObjectProvider. Если можно обратиться к члену кода, к нему можно выполнить привязку. Например, если динамический объект позволяет получить доступ к члену в коде с помощью someObject.AProperty, к нему можно выполнить привязку, задав в качестве пути привязки AProperty.
Объекты ADO.NET Вы можете выполнить привязку к объектам ADO.NET, например, DataTable. Класс DataView ADO.NET реализует интерфейс IBindingList, предоставляющий уведомления об изменениях, которые прослушивает обработчик привязки.
Объекты XML Вы можете выполнить привязку к объектам XmlNode, XmlDocument или XmlElement и выполнять запросы XPath для этих объектов. Для удобного доступа к данным XML, которые представляют собой источник привязки в разметке, можно использовать объект XmlDataProvider. Дополнительные сведения см. в разделе Привязка к XML-данным с помощью XMLDataProvider и запросов XPath.

Можно также выполнить привязку к объектам XElement или XDocument или к результатам запросов, выполняемых с объектами этих типов, с помощью LINQ to XML. Для удобного доступа к данным XML, которые представляют собой источник привязки в разметке, с помощью LINQ to XML можно использовать объект ObjectDataProvider. Дополнительные сведения см. в разделе Привязка к XDocument, XElement или LINQ для результатов запросов XML.
Объекты DependencyObject Вы можете выполнить привязку к свойствам зависимостей любого объекта DependencyObject. Пример см. в разделе Как привязать свойства двух элементов управления.

Использование класса в качестве источника привязки

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

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

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

При создании объекта CLR, который не реализует INotifyPropertyChanged, необходимо реализовать свою систему уведомлений, чтобы обеспечивать актуальность данных, используемых в привязке. Можно предоставить уведомление об изменениях с помощью шаблона PropertyChanged для каждого свойства, для которого требуются уведомления об изменении. Для поддержки этого шаблона необходимо определить событие PropertyNameChanged для каждого свойства, где PropertyName — это имя свойства. Событие вызывается каждый раз при изменении свойства.

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

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

Ниже приведены другие важные замечания.

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

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

  • Привязка к открытым полям невозможна.

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

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

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

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

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

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

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

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

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

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

Требования к разрешениям в привязке данных

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

Тип свойства

(Все модификаторы доступа)
Свойство динамического объекта Свойство динамического объекта Свойство CLR Свойство CLR Свойство зависимостей Свойство зависимостей
Уровень доверия Полное доверие Частичное доверие Полное доверие Частичное доверие Полное доверие Частичное доверие
Открытый класс Да Да Да Да Да Да
Закрытый класс Да Нет Да Нет Да Да

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

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

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

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

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

Объекты анонимных типов являются внутренними. Можно выполнить привязку к свойствам анонимных типов только при работе в режиме полного доверия. Дополнительные сведения об анонимных типах см. в разделах Анонимные типы (руководство по программированию на C#) или Анонимные типы (Visual Basic) (Visual Basic).

Дополнительные сведения о безопасности частичного доверия см. в разделе Безопасность частичного доверия в WPF.

См. также