Общие сведения об источниках привязки
В привязке данных объект источника привязки (источник) ссылается на объект, из которого вы получаете данные. В этом разделе рассматриваются типы объектов, которые можно использовать в качестве источника привязки.
Типы источников привязки
Windows Presentation Foundation (WPF) Привязка данных поддерживает следующие типы источников привязки:
Источник привязки | Описание |
---|---|
CLR объекты | Можно осуществить привязку к открытым свойствам, подсвойствам, а также индексаторам любого объекта CLR. Обработчик привязки использует отражение CLR для получения значений свойств. Кроме того, объекты, реализующие ICustomTypeDescriptor или имеют зарегистрированные TypeDescriptionProvider также работают с обработчиком привязки. Дополнительные сведения о том, как реализовать класс, который можно использовать в качестве источника привязки, см. в разделе Использование класса в качестве источника привязки. |
динамические объекты | Можно привязать к доступным свойствам и индексаторам объекта, который реализует IDynamicMetaObjectProvider интерфейс. Если можно обратиться к члену кода, к нему можно выполнить привязку. Например, если динамический объект позволяет получить доступ к члену в коде с помощью someObjet.AProperty , к нему можно выполнить привязку, задав в качестве пути привязки AProperty . |
ADO.NET объекты | Можно привязать к ADO.NET объекты, такие как DataTable. ADO.NET DataView Реализует IBindingList интерфейс, который предоставляет уведомления об изменениях, которые прослушивает механизм привязки. |
XML объекты | Можно привязать к и запустить XPath запрашивает на XmlNode, XmlDocument, или XmlElement. Удобный способ доступа к XML данных, который является источником привязки в разметке, можно выполнить XmlDataProvider объекта. Дополнительные сведения см. в разделе Привязка к XML-данным с помощью XMLDataProvider и запросов XPath.Также можно привязать к XElement или XDocument, или выполнить привязку к результатам запросов, выполняемых для объектов этих типов с помощью LINQ to XML. Для использования LINQ to XML для доступа к данным 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.