Обзор источников привязки (WPF .NET)

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

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

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

  • Объекты среды CLR .NET

    Вы можете привязать к общедоступным свойствам, вложенным свойствам и индексаторам любого объекта среды 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" (платформа .NET Framework).

    Можно также выполнить привязку к объектам XElement или XDocument или к результатам запросов, выполняемых с объектами этих типов, с помощью LINQ to XML. Для удобного доступа к данным XML, которые представляют собой источник привязки в разметке, с помощью LINQ to XML можно использовать объект ObjectDataProvider. Дополнительные сведения см. в разделе Bind to XDocument, XElement или LINQ for XML Query Results (платформа .NET Framework).

  • DependencyObject Объектов

    Вы можете выполнить привязку к свойствам зависимостей любого объекта DependencyObject. Пример см. в разделе "Привязка свойств двух элементов управления" (платформа .NET Framework).

Реализация источника привязки для объектов

Объекты СРЕДЫ CLR могут стать источниками привязки. При реализации класса в качестве источника привязки следует учитывать несколько вещей.

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

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

Существует два способа уведомления подписчика об изменении свойства:

  1. Реализуйте интерфейс INotifyPropertyChanged.

    Это рекомендуемый механизм для уведомлений. PropertyChanged Предоставляет INotifyPropertyChanged событие, которое учитывает система привязки. Создав это событие и указав имя измененного свойства, вы уведомите целевой объект привязки об изменении.

  2. PropertyChanged Реализуйте шаблон.

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

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

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

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

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

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

  • Нельзя привязать к общедоступным полям.

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

Все объекты в качестве источника привязки

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

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

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

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

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

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

При указании коллекции в качестве источника привязки WPF не привязывается непосредственно к коллекции. Вместо этого WPF фактически привязывается к представлению коллекции по умолчанию. Сведения о представлениях по умолчанию см. в разделе "Использование представления по умолчанию".

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

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

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

См. также