Bindings
You bind in XAML using the {Binding} markup extension. By using bindings (assuming you've implemented change notifications) any changes to the data context will automatically be updated in the control.
By default a binding binds to a property on the DataContext, e.g.:
<!-- 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}"/>
An empty binding binds to DataContext itself
<!-- Binds to the TextBlock's DataContext property -->
<TextBlock Text="{Binding}"/>
​
<!-- Which is the same as -->
<TextBlock Text="{Binding .}"/>
We call the property on the control the binding target and the property on the DataContext the binding source.

Binding Path

The binding path above can be a single property, or it can be a chain of properties. For example if the object assigned to the DataContext has a Student property, and the value of this property has a Name, you can bind to the student name using:
<TextBlock Text="{Binding Student.Name}"/>
You can also include array/list indexers in binding paths:
<TextBlock Text="{Binding Students[0].Name}"/>

Binding Modes

You can change the behavior of a {Binding} by specifying a binding Mode:
<TextBlock Text="{Binding Name, Mode=OneTime}">
The available binding modes are:
Mode
Description
OneWay
Changes to the source are automatically propagated to the target
TwoWay
Changes to the source are automatically propagated to the target and vice-versa
OneTime
The value from the source is propagated at initialization to the target and subsequent changes are ignored
OneWayToSource
Changes to the target are propagated to the source
Default
The binding mode is based on the property
The Default mode is assumed if one is not specified. This mode is generally OneWay for control properties that do not change due to user input (e.g. TextBlock.Text) and TwoWay for control properties that do change due to user input (e.g. TextBox.Text).

String Formatting

You can apply a format string to the binding to influence how the value is represented in the UI:
<!-- 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.'}" />
When a StringFormat parameter is present, the value of the binding will be converted using the StringFormatValueConverter which will be passed the format string.
Other than in WPF, you need to surround the string format with curly braces and start with 0: ({0:TheStringFormat}). If the curly braces are at the beginning of the format string, you need to escape them by either adding {} in front of it or by using backslashes \{ ... \}:
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\}}" />
Read more about the available string formats in the Microsoft Docs​

Samples

​Basic MVVM Sample​
Export as PDF
Copy link
Edit on GitHub
Outline
Binding Path
Binding Modes
String Formatting
Samples