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


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

Обновлен: Ноябрь 2007

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

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

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

Необходимые компоненты

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

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

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

В этом разделе описывается объявление привязки в Язык XAML (Extensible Application Markup Language).

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

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

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

<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 и указание свойств в коде:

    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=.}”.

Механизм исключения

  • Внутри индексаторов ([ ]) знак "крышки" (^) используется для пропуска следующего символа.

  • Если в 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.

См. также

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

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

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

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

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