Общие сведения об объявлениях привязки (WPF .NET)

Общие сведения об объявлениях привязки (WPF .NET)

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

Предварительные требования

Прежде чем читать эту статью, важно ознакомиться с концепцией и использованием расширений разметки. Подробнее о расширениях разметки см. в разделе Расширения разметки и XAML WPF.

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

Объявление привязки в XAML

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

При создании строк объявления привязки в разметке они должны быть присоединены к конкретному свойству зависимостей целевого объекта. В следующем примере показано, как привязать TextBox.Text свойство с помощью расширения привязки, указав Source Свойства и Path .

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

Синтаксис элемента Object

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

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

Классы MultiBinding и PriorityBinding

MultiBinding и PriorityBinding не поддерживают синтаксис расширения XAML. Именно поэтому при объявлении MultiBinding или PriorityBinding в XAML необходимо использовать синтаксис объектного элемента.

Создание привязки в коде

Другой способ указания привязки — задать свойства непосредственно для Binding объекта в коде, а затем присвоить привязку свойству. В следующем примере показано, как создать Binding объект в коде.

Предыдущий код задает для привязки следующее:

  • Путь к свойству объекта источника данных.
  • Режим привязки.
  • Источник данных, в данном случае простой экземпляр объекта, представляющий человека.
  • Необязательный преобразователь, который обрабатывает значение, поступающее из объекта источника данных, прежде чем оно будет назначено целевому свойству.

Если привязка объекта является FrameworkElement или FrameworkContentElement , можно вызвать SetBinding метод для объекта напрямую, а не использовать BindingOperations.SetBinding . Пример см. в разделе как создать привязку в коде.

В предыдущем примере используется простой тип Person объекта данных. Ниже приведен код для этого объекта.

Синтаксис пути привязки

PathИспользуйте свойство, чтобы указать исходное значение, к которому необходимо выполнить привязку:

В самом простом случае Path значением свойства является имя свойства исходного объекта, используемого для привязки, например Path=PropertyName .

Вложенные свойства свойства могут быть заданы с помощью аналогичного синтаксиса, как в C#. Например, предложение Path=ShoppingCart.Order задает привязку к подсвойству Order объекта или свойства ShoppingCart .

Для привязки присоединенного свойства заключите его в скобки. Например, для привязки к присоединенному свойству DockPanel.Dock используется Path=(DockPanel.Dock) синтаксис.

Индексаторы свойства можно указать в квадратных скобках после имени свойства, для которого применяется индексатор. Например, предложение Path=ShoppingCart[0] задает привязку к индексу, который соответствует способу, который внутренняя индексация свойства использует для обработки символьной строки "0". Также поддерживаются вложенные индексаторы.

Индексаторы и вложенные свойства могут сочетаться в предложении Path , например, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

Внутри индексаторов. Можно использовать несколько параметров индексатора, разделенных запятыми ( , ). Тип каждого параметра указывается в скобках. Например, вы можете задать предложение Path="[(sys:Int32)42,(sys:Int32)24]" , где sys сопоставляется с пространством имен System .

Если источником является представление коллекции, текущий элемент можно указать с помощью косой черты ( / ). Например, предложение Path=/ задает привязку к текущему элементу в представлении. Если источником является коллекция, этот синтаксис задает текущий элемент представления коллекции по умолчанию.

Имена свойств и косые черты можно объединять для обхода свойств, которые являются коллекциями. Например, предложение Path=/Offices/ManagerName задает текущий элемент коллекции источников, где свойство Offices также является коллекцией. Текущий элемент этой коллекции — объект, содержащий свойство ManagerName .

При необходимости можно использовать путь к точке ( . ) для привязки к текущему источнику. Например, выражение Text="" будет эквивалентно Text="" .

Механизм экранирования

Внутри индексаторов ( [ ] ) символ крышки ( ^ ) обходит следующий символ.

Если вы Path задали в XAML, вам также потребуется экранировать (с помощью сущностей XML) определенные символы, которые являются специальными для определения языка XML:

Используйте & для экранирования символа " & ".

Используйте > для экранирования закрывающего тега " > ".

Кроме того, если вы описываете всю привязку в атрибуте с помощью синтаксиса расширения разметки, необходимо escape-символы (с использованием обратной косой черты \ ), которые являются специальными для средства синтаксического анализа расширения разметки WPF:

Обратная косая черта ( \ ) сама по себе является escape-символом.

Знак равенства ( = ) разделяет имя и значение свойства.

Запятая ( , ) разделяет свойства.

Закрывающая фигурная скобка ( > ) — это конец расширения разметки.

Направление привязки

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

Режим привязки Описание BindingMode.TwoWay Обновляет целевое свойство или свойство, когда изменяется либо свойство Target, либо свойство Source. BindingMode.OneWay Обновляет свойство Target только при изменении свойства Source. BindingMode.OneTime Обновляет целевое свойство только при запуске приложения или при DataContext изменении. BindingMode.OneWayToSource Обновляет исходное свойство при изменении целевого свойства. BindingMode.Default Вызывает использование значения по умолчанию Mode целевого свойства.

Дополнительные сведения см. в описании перечисления BindingMode.

В следующем примере показано, Mode как задать свойство:

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

Для TwoWay привязок или OneWayToSource можно управлять временем обновлений источника, задав UpdateSourceTrigger свойство. Для получения дополнительной информации см. UpdateSourceTrigger.

Поведение по умолчанию

Поведение по умолчанию выглядит следующим образом, если оно не указано в объявлении:

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

Если не задать ConverterCulture , подсистема привязки использует Language свойство целевого объекта привязки. В XAML по умолчанию используется en-US или наследует значение корневого элемента (или любого элемента) страницы, если он был явно задан.

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

📎📎📎📎📎📎📎📎📎📎