Привязки
Вы выполняете привязку в XAML, используя расширение разметки {Binding}
. При использовании привязок (при условии, что вы реализовали уведомления об изменениях) любые изменения контекста данных будут автоматически обновляться в элементе управления.
По умолчанию привязка назначается свойству в DataContext, например:
<!-- Binds to the TextBlock's DataContext.Name property --> <TextBlock Text="{Binding Name}"/> <!-- Which is the same as ('Path' is optional) --> <TextBlock Text="{Binding Path=Name}"/>
Пустая привязка привязывается к самому DataContext
<!-- Binds to the TextBlock's DataContext property --> <TextBlock Text="{Binding}"/> <!-- Which is the same as --> <TextBlock Text="{Binding .}"/>
Мы называем свойство элемента управления целью привязки, а свойство DataContext
— источником привязки.
Путь привязки
Приведенный выше путь привязки может быть отдельным свойством или цепочкой свойств. Например, если объект, назначенный DataContext
, имеет свойство Student
, а значение этого свойства имеет Name
, вы можете привязаться к имени студента, используя:
<TextBlock Text="{Binding Student.Name}"/>
Вы также можете включить индексаторы массива/списка в пути привязки:
<TextBlock Text="{Binding Students[0].Name}"/>
Режимы привязки
Вы можете изменить поведение {Binding}
, указав режим привязки (Mode
):
<TextBlock Text="{Binding Name, Mode=OneTime}">
Доступные режимы привязки:
Режим | Описание |
---|---|
OneWay |
Изменения в источнике автоматически распространяются на цель. |
TwoWay |
Изменения в источнике автоматически распространяются на цель и наоборот. |
OneTime |
Значение из источника распространяется при инициализации на цель, а последующие изменения игнорируются. |
OneWayToSource |
Изменения в цели распространяются на источник. |
Default |
Режим привязки основан на свойстве. |
Предполагается режим по умолчанию, если он не указан. Этот режим обычно является односторонним для свойств элемента управления, которые не изменяются из-за ввода пользователя (например, TextBlock.Text
), и двусторонним для свойств элемента управления, которые изменяются из-за пользовательского ввода (например, TextBox.Text
).
Форматирование строк
Вы можете применить строку формата к привязке, чтобы повлиять на представление значения в пользовательском интерфейсе:
<!-- Option 1: Use curly braces {} to escape string format --> <TextBlock Text="{Binding FloatValue, StringFormat={}{0:0.0}}" /> <!-- Option 2: Use backslash \{ to escape string format --> <TextBlock Text="{Binding FloatValue, StringFormat=\{0:0.0\}}" /> <!-- Option 3: If the string format does not start with {0}, you don't need to escape the string format. --> <!-- Note: If you have a whitespace in your string format, surround it with single quotes '' --> <TextBlock Text="{Binding Animals.Count, StringFormat='I have {0} animals.'}" /> <!-- Note: You need to escape the curly braces in case your format string starts with the value you are binding, like so: --> <TextBlock Text="{Binding Animals.Count, StringFormat='{}{0} animals live in the farm.'}" />
При наличии параметра StringFormat
значение привязки будет преобразовано с использованием StringFormatValueConverter
, которому будет передана строка формата.
В отличие от WPF, формат строки необходимо заключить в фигурные скобки и начать с 0: ({0:TheStringFormat}
). Если фигурные скобки находятся в начале строки формата, даже если они заключены в одинарные кавычки, вам нужно экранировать их, либо добавив перед ними {}
, либо используя обратную косую черту \{ ... \}
:
WPF:
<TextBlock Text="{Binding FloatValue, StringFormat=0.0}" />
Avalonia:
<TextBlock Text="{Binding FloatValue, StringFormat={}{0:0.0}}" /> <TextBlock Text="{Binding FloatValue, StringFormat=\{0:0.0\}}" /> <TextBlock Text="{Binding FloatValue, StringFormat='{}{0:0.0}'}" />
Дополнительные сведения о доступных форматах строк см. в Microsoft Docs.