Общие сведения об объявлении привязок

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

В этом разделе содержатся следующие подразделы.

  • Предварительные требования
  • Объявление привязки в XAML
  • Создание привязки в коде
  • Синтаксис Binding.Path
  • Поведения по умолчанию
  • Связанные разделы

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

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

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

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

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

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

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

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

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

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

Синтаксис объектного элемента

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

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

<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 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)



...


    End Sub
    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);



...


}

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

Синтаксис Binding.Path

Свойство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.

См. также

Ссылки

Синтаксис PropertyPath XAML

Основные понятия

Общие сведения о связывании данных

Оптимизация производительности: привязка данных

Другие ресурсы

Практические руководства по привязке данных

Журнал изменений

Дата

Журнал

Причина

сентябрь 2010 г.

Объяснен объект TheConverter в разделе "Создание привязки в коде".

Обратная связь от клиента.