UpdateSourceTrigger

This is a property on a binding that controls the data flow from a target to a source and used for two-way databinding. The default mode is when the focus changes but there are many other options available, that we will see in this article.

Data trigger scenarios

Let's talk about some of the data trigger scenarios. By default, modified values in the binding controls only get pushed down when we do activity related to focus change, like tab out, minimizing and maximizing window, and so on.

In some scenarios we want to update values as quickly as possible, or let's say with every keystoke. So, to do that Microsoft provided UpdateSourceTrigger.

Properties available with UpdateSourceTrigger

Default vs LostFocus

Default and LostFocus means the same thing for most of the controls with the exception of DataGrid. For DataGrid:

Code Walkthrough

Now let's have a look at the example and sample code:

<Window x:Class="UpdateSourcePropertyDemo.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="MainWindow" Height="150" Width="525">

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="50*"/>

<ColumnDefinition Width="50*"/>

</Grid.ColumnDefinitions>

<TextBlock Text="Source:" Width="auto"/>

<TextBox Name="SourceText" Width="160" Height="30" Margin="48,0,44,82" />

<TextBlock Text="Target:" Grid.Column="1" Width="auto"/>

<TextBox Name="TargetText" Width="160" Height="30"

Grid.Column="1" Margin="44,0,47,82" />

</Grid>

</Window>

In the code above I am creating 2 TextBlocks and 2 TextBoxes, that will be shown as:

UpdateSourcePropertyDemo

Please note, as of now I haven't done any binding on my textboxes. As a next step, let's pick properties of UpdateSourceTrigger and see what each one does.

Default: When the user changes a value in the source TextBox, the value will be automatically updated in the target TextBox. But when the user modifies the value in the target TextBox, it won't be reflected in the source TextBox, until loss of focus happens.

Code

<grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="50*"/>

<ColumnDefinition Width="50*"/>

</Grid.ColumnDefinitions>

<TextBlock Text="Source:" Width="auto"/>

<TextBox Name="SourceText" Width="160" Height="30" Margin="48,0,44,82" />

<TextBlock Text="Target:" Grid.Column="1" Width="auto"/>

<TextBox Name="TargetText" Width="160" Height="30"

Text="{Binding ElementName=SourceText, Path=Text,UpdateSourceTrigger=Default}"

Grid.Column="1" Margin="44,0,47,82" />

</grid>

Output

When the user types into the source TextBox :

Default Property

When user types in Target TextBox :

user types in Target

LostFocus: As I mentioned earlier, except for a DataGrid, LostFocus behaves the same for all the controls as the Default property.

Code

<grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="50*"/>

<ColumnDefinition Width="50*"/>

</Grid.ColumnDefinitions>

<TextBlock Text="Source:" Width="auto"/>

<TextBox Name="SourceText" Width="160" Height="30" Margin="48,0,44,82" />

<TextBlock Text="Target:" Grid.Column="1" Width="auto"/>

<TextBox Name="TargetText" Width="160" Height="30"

Text="{Binding ElementName=SourceText, Path=Text,UpdateSourceTrigger=LostFocus}"

Grid.Column="1" Margin="44,0,47,82" />

</grid>

Output

Here the output will be the same as in the above case (Default) as it is for a TextBox.

PropertyChanged: If the UpdateSourceTrigger property is set to PropertyChanged, then everytime both the source and target will be synchronized. In other words, updating the source TextBox will update the target TextBox on every keystroke and that proves true if the value is updated in the target TextBox.

Code

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="50*"/>

<ColumnDefinition Width="50*"/>

</Grid.ColumnDefinitions>

<TextBlock Text="Source:" Width="auto"/>

<TextBox Name="SourceText" Width="160" Height="30" Margin="48,0,44,82" />

<TextBlock Text="Target:" Grid.Column="1" Width="auto"/>

<TextBox Name="TargetText" Width="160" Height="30"

Text="{Binding ElementName=SourceText, Path=Text,UpdateSourceTrigger=PropertyChanged}"

Grid.Column="1" Margin="44,0,47,82" />

</Grid>

Output

When the user types into the source TextBox:

PropertyChanged

When the user types into the Target TextBox:
user types in Target TextBox

After reading this article, I hope you have a clear understanding of UpdateSourceProperty.