Общие сведения об источниках привязки
В привязке данных объект-источник привязки означает объект, из которого получаются данные. В этом разделе рассматриваются типы объектов, которые можно использовать в качестве источника привязки.
В этом разделе содержатся следующие подразделы.
- Типы источников привязки
- Реализация класса, используемого как источник привязки
- Использование всего объекта в качестве источника привязки
- Использование объекта коллекции в качестве источника привязки
- Необходимые разрешения при использовании привязки данных
- Связанные разделы
Типы источников привязки
Привязка данных Windows Presentation Foundation (WPF) поддерживает следующие типы источника привязки:
Источник привязки |
Описание |
---|---|
Объекты common language runtime (CLR) |
Можно выполнять привязку к открытым свойствам, подсвойствам, а также индексаторам любого объекта common language runtime (CLR). Обработчик привязки использует отражение CLR для получения значений свойств. Кроме того, объекты, которые реализуют ICustomTypeDescriptor или имеют зарегистрированные TypeDescriptionProvider, также работают с обработчиком привязки. Дополнительные сведения о реализации класса, который можно использовать как источник привязки, см. в подразделе Реализация класса, используемого как источник привязки далее в этом разделе. |
Динамические объекты |
Можно выполнять привязку к доступным свойствам и индексаторам объекта, реализующего интерфейс IDynamicMetaObjectProvider. Если к элементу можно обратиться в коде, к нему можно выполнить привязку. Например, если динамический объект позволяет обратиться к методу в коде через свойство someObjet.AProperty, к нему можно выполнить привязку, указав путь привязки AProperty. |
Объекты ADO.NET |
Можно выполнять привязку к объектам ADO.NET, таким как DataTable. Объект DataView ADO.NET реализует интерфейс IBindingList, предоставляющий уведомления об изменениях, ожидаемые модулем привязки. |
Объекты XML |
Можно выполнять привязку и запросы XPath для объектов XmlNode, XmlDocument и XmlElement. Удобный способ доступа к данным XML, которые являются источником привязки в разметке, заключается в использовании объекта XmlDataProvider. Дополнительные сведения см. в разделе Практическое руководство. Привязка к данным xml с помощью XMLDataProvider и запросов XPath. Также можно выполнять привязку к объектам XElement и XDocument и к результатам запросов, выполняемых для объектов этих типов с помощью средства LINQ to XML. Удобный способ доступа к данным XML, являющимся источником привязки, с помощью средства LINQ to XML в разметке заключается в использовании объекта ObjectDataProvider. Дополнительные сведения см. в разделе Практическое руководство. Привязка к XDocument, XElement или LINQ для результатов запросов XML. |
Объекты DependencyObject |
Можно выполнять привязку к свойствам зависимости любого объекта DependencyObject. Пример см. в разделе Как привязать свойства двух элементов управления. |
Реализация класса, используемого как источник привязки
Можно создавать собственные источники привязки. В этом разделе приводятся сведения, необходимые для реализации класса, используемого как источник привязки.
Предоставление уведомлений об изменениях
Если используется привязка OneWay или TwoWay (поскольку требуется, чтобы UI обновлялся при динамическом изменении свойств источника привязки), необходимо реализовать подходящий механизм уведомления об изменениях свойств. Рекомендуемым механизмом для классов CLR и динамических классов является реализация интерфейса INotifyPropertyChanged. Дополнительные сведения см. в разделе Практическое руководство. Реализация уведомления об изменении свойства.
Если создать объект CLR, в котором не реализован INotifyPropertyChanged, необходимо реализовать свою систему уведомлений, обеспечивающую обновление данных, используемых в привязке. Вы можете предоставить уведомление об изменениях при помощи шаблона PropertyChanged для каждого свойства для которого вам требуются уведомления об изменении. Для этого необходимо определить событие PropertyNameChanged для каждого свойства, где PropertyName — это имя свойства. Вы вызываете событие каждый раз при изменении свойства.
Если в источнике привязки реализован один или несколько таких механизмов уведомления, целевой объект обновляется автоматически. Если по какой-либо причине источник привязки не обеспечивает соответствующие уведомления об изменениях свойств, можно использовать метод UpdateTarget для обновления целевого свойства явным образом.
Другие характеристики
Ниже приведены другие важные моменты:
Если вам требуется создать объект в XAML, класс должен иметь конструктор по умолчанию. В некоторых языках .NET, таких как C#, конструктор по умолчанию может быть уже создан для вас.
Свойства, используемые в качестве свойств источника привязки, должны быть открытыми свойствами класса. Явно определенные свойства интерфейса не могут использоваться для привязки, так же как и защищенные, закрытые, внутренние и виртуальные свойства, не имеющие базовой реализации.
Можно выполнять привязку к открытым полям.
Тип свойства, объявленного в вашем классе, является типом, передаваемым привязке. Однако тип используемой привязки в конечном счете зависит от типа свойства цели привязки, а не свойства источника привязки. Если есть разница в типе, вам может потребоваться написать преобразователь для обработки того, как ваше пользовательское свойство по умолчанию передается привязке. Дополнительные сведения см. в разделе IValueConverter.
Использование всего объекта в качестве источника привязки
В качестве объекта привязки можно использовать весь объект. Можно указать источник привязки с помощью свойства Source или DataContext, затем добавить пустое определение привязки: {Binding}. Сценарии, в которых это полезно, включают привязку к объектам строкового типа, привязку к объектам с несколькими интересующими вас свойствами или привязку к коллекции объектов. Пример привязки к целому объекту коллекции содержится в разделе Практическое руководство. Использование шаблона "основной-подчиненный" с иерархическими данными.
Обратите внимание, что вам, возможно, потребуется применить пользовательскую логику, чтобы данные были применимы к вашему привязанному свойству цели. Пользовательская логика может быть в виде пользовательского преобразователя (если не существует преобразования типа по умолчанию) или DataTemplate. Дополнительные сведения о преобразователях см. в подразделе "Преобразование данных" раздела Общие сведения о связывании данных. Дополнительные сведения о шаблонах данных см. в разделе Общие сведения о шаблонах данных.
Использование объекта коллекции в качестве источника привязки
Нередко возникает необходимость использовать в качестве источника привязки объект, являющийся коллекцией пользовательских объектов. Каждый объект играет роль источника для одного экземпляра повторной привязки. Допустим, к примеру, что имеется коллекция CustomerOrders, состоящая из объектов CustomerOrder, и разрабатываемое приложение поочередно рассматривает элементы коллекции, пытаясь определить, сколько существует заказов, и прочитать данные, содержащиеся в каждом из них.
Пользователь может выполнить перечисление элементов любой коллекции, реализующей интерфейс IEnumerable. Однако чтобы настроить динамические привязки таким образом, чтобы вставки и удаления элементов в коллекции автоматически обновляли UI, в коллекции должен быть реализован интерфейс 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.
См. также
Задачи
Практическое руководство. Указание источника привязки
Ссылки
Основные понятия
Общие сведения о связывании данных
Общие сведения о связывании с данными в WPF с помощью LINQ to XML
Оптимизация производительности: привязка данных