Общие сведения об объявлении привязок
В этом разделе описываются различные способы объявления привязок.
Предварительные требования
Важно, чтобы перед прочтением этого раздела вы были знакомы с основными понятиями и принципами использования расширений разметки. Подробнее о расширениях разметки см. в разделе Расширения разметки и 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 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;
}
Если вы выполняете привязку объекта 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:
Используйте
&
в качестве escape-символа для символа &.Используйте
>
для экранирования закрывающего тега ">".
Кроме того, если вы задаете всю привязку в атрибуте, используя синтаксис расширения разметки, необходимо экранировать (с помощью обратной косой черты \) символы, которые являются специфическими для синтаксического анализатора расширения разметки WPF.
Обратная косая черта (\) сама по себе является escape-символом.
Знак равенства (=) разделяет имя свойства и значение этого свойства.
Запятая (,) отделяет свойства друг от друга.
Закрывающая фигурная скобка (}) указывает конец расширения разметки.
Поведение по умолчанию
Поведение по умолчанию выглядит следующим образом, если не указано в объявлении.
Создается преобразователь по умолчанию, который пытается выполнить преобразование типов между значением источника привязки и значением целевого объекта привязки. Если преобразование не удается выполнить, преобразователь по умолчанию возвращает значение
null
.Если вы не установите ConverterCulture, обработчик привязки использует
Language
свойство целевого объекта привязки. В языке XAML это свойство по умолчанию имеет значение "en-US" или наследует свое значение от корневого элемента (или любого элемента) страницы, если оно было задано явным образом.Условии, что привязка уже имеет контекст данных (например, наследуемым контекстом данных ожидается от родительского элемента), а объект или коллекция возвращаемые этим контекстом для привязки без необходимости дальнейшего изменения пути, объявление привязки можно вообще не иметь предложений:
{Binding}
Это часто способ привязка задается для стилей данных, где привязка воздействует на коллекцию. Дополнительные сведения см. в подразделе "Использование всего объекта в качестве источника привязки" раздела Общие сведения об источниках привязки.Значение по умолчанию Mode различается для односторонней и двусторонней в зависимости от свойства зависимостей, к которому осуществляется привязка. Режим привязки всегда можно объявить явным образом, чтобы обеспечить требуемое поведение привязки. В свойствах общее, доступного для редактирования пользователями элемента управления такие как TextBox.Text и RangeBase.Value, по умолчанию имеют двухсторонние привязки, а для большинства других свойств по умолчанию имеют односторонние привязки.
Значение по умолчанию UpdateSourceTrigger значение зависит от используемого PropertyChanged и LostFocus в зависимости от связанного свойства зависимостей также. Значение по умолчанию для большинства свойств зависимостей — PropertyChanged, а свойство TextBox.Text имеет значение по умолчанию LostFocus.