Поделиться через


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

В этом разделе рассматриваются различные способы объявления привязки.

Необходимые условия

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

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

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

В этом разделе описывается объявление привязки в XAML.

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

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

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

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

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

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

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

Ниже приведен пример синтаксиса элемента объекта и использования расширения разметки:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

В примере осуществляется привязка свойства Foreground путем объявления привязки с помощью синтаксиса расширения. Объявление привязки для свойства Text использует синтаксис элемента объекта.

Дополнительные сведения о различных терминах см. в разделе «Подробный синтаксис XAML».

MultiBinding и PriorityBinding

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

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

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

private void OnPageLoaded(object sender, EventArgs e)
{
    // Make a new source, to grab a new timestamp
    MyData myChangedData = new MyData();

    // Create a new binding
    // TheDate is a property of type DateTime on MyData class
    Binding myNewBindDef = new Binding("TheDate");

    myNewBindDef.Mode = BindingMode.OneWay;
    myNewBindDef.Source = myChangedData;
    myNewBindDef.Converter = TheConverter;
    myNewBindDef.ConverterCulture = new CultureInfo("en-US");

      // myDatetext is a TextBlock object that is the binding target object
    BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
    BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);

    lbChooseCulture.SelectedIndex = 0;
}
 Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
     ' Make a new source, to grab a new timestamp
     Dim myChangedData As New MyData()

     ' Create a new binding
 ' TheDate is a property of type DateTime on MyData class
     Dim myNewBindDef As New Binding("TheDate")

     myNewBindDef.Mode = BindingMode.OneWay
     myNewBindDef.Source = myChangedData
     myNewBindDef.Converter = TheConverter
     myNewBindDef.ConverterCulture = New CultureInfo("en-US")

' myDatetext is a TextBlock object that is the binding target object
     BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
     BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)

     lbChooseCulture.SelectedIndex = 0
 End Sub

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

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

Используйте свойство 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="{Binding}" эквивалентен Text="{Binding Path=.}".

Механизм выхода

  • Внутри индексаторов ([ ]), символ курсора (^) экранирует следующий символ.

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

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

    • Используйте &gt; для экранирования конечного тега>.

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

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

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

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

    • Правая фигурная скобка (}) — это конец расширения разметки.

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

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

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

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

  • Если привязка уже имеет контекст данных (например, наследуемый контекст данных от родительского элемента), и любой элемент или коллекция, возвращаемый этим контекстом, подходит для привязки без необходимости дальнейшего изменения пути, тогда объявление привязки может полностью отсутствовать: {Binding} Это часто встречается при стилизации данных, где привязка применяется к коллекции. Дополнительную информацию см. в разделе "Все объекты, используемые в качестве источника привязки" в обзоре источников привязки.

  • Значение по умолчанию Mode варьируется между односторонней и двухсторонней привязкой в зависимости от привязанного свойства зависимости. Вы всегда можете явно объявить режим привязки, чтобы убедиться, что ваша привязка имеет требуемое поведение. Как правило, свойства элемента управления, редактируемые пользователем, такие как TextBox.Text и RangeBase.Value, по умолчанию имеют двусторонняя привязка, в то время как большинство других свойств по умолчанию являются односторонними привязками.

  • Значение по умолчанию UpdateSourceTrigger изменяется в диапазоне от PropertyChanged до LostFocus также в зависимости от привязанного свойства зависимости. Значение по умолчанию для большинства свойств зависимостей — PropertyChanged, а свойство TextBox.Text имеет значение по умолчанию LostFocus.

См. также