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