This article has been localized into French by the community.
La propriété UpdateSourceTrigger
Dans le chapitre précédent, nous avons vu que les changements dans une TextBox n'étaient pas immédiatement renvoyés à la source. À la place, la source se mettait à jour uniquement après que le focus de la TextBox soit perdu. Ce comportement est contrôlé par une propriété du binding appelée UpdateSourceTrigger. Sa valeur par défaut est "Default", qui signifie que la source est mise à jour sur base de la propriété à laquelle elle est liée. Actuellement, toutes les propriétés - excepté la propriété Text - se mettent à jour dès que la propriété change (PropertyChanged), alors que la propriété Text se met à jour quand le focus sur l'élément de destination est perdu.
Évidemment "Default" est la valeur par défaut de UpdateSourceTrigger. Les autres options sont PropertyChanged, LostFocus et Explicit. Les deux premières ont déjà été expliquées, alors que la dernière signifie seulement que la mise à jour doit être provoquée manuellement pour pouvoir se faire, en appelant UpdateSource sur le Binding.
Pour voir comment toutes ces options fonctionnent, j'ai mis à jour l'exemple du précédent chapitre pour toutes vous les montrer :
<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataContextSample" Height="130" Width="310">
<StackPanel Margin="15">
<WrapPanel>
<TextBlock Text="Window title: " />
<TextBox Name="txtWindowTitle" Text="{Binding Title, UpdateSourceTrigger=Explicit}" Width="150" />
<Button Name="btnUpdateSource" Click="btnUpdateSource_Click" Margin="5,0" Padding="5,0">*</Button>
</WrapPanel>
<WrapPanel Margin="0,10,0,0">
<TextBlock Text="Window dimensions: " />
<TextBox Text="{Binding Width, UpdateSourceTrigger=LostFocus}" Width="50" />
<TextBlock Text=" x " />
<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged}" Width="50" />
</WrapPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfTutorialSamples.DataBinding
{
public partial class DataContextSample : Window
{
public DataContextSample()
{
InitializeComponent();
this.DataContext = this;
}
private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
{
BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}
}
}
Comme vous pouvez le voir, chacune des trois TextBox utilise maintenant un UpdateSourceTrigger différent.
La première est définie comme Explicit, ce que veut dire que la source ne sera pas mise à jour à moins que vous le fassiez manuellement. Pour cette raison, j'ai ajouté un bouton à côté de la TextBox qui va mettre à jour la source sur demande. Dans le Code-behing, vous trouverez le handler de l'événement Click, où nous utilisons deux lignes de code pour récupérer le binding du contrôle de destination et pour ensuite appeler la méthode UpdateSource() dessus.
La seconde TextBox utilise la valeur LostFocus, qui est en fait la valeur par défaut pour un binding d'une propriété Text. Cela signifie que la valeur source sera mise à jour à chaque fois que le contrôle de destination perd le focus.
La troisième et dernière TextBox utilise la valeur PropertyChanged, qui signifie que la valeur source sera mise à jour chaque fois que la propriété liée change, ce qui se produit dès que le texte change.
Essayez d'exécuter l'exemple sur votre propre machine et observez comment les trois TextBox réagissent complètement différemment. La première valeur ne se met à jour qu'au moment où vous cliquez sur le bouton, la deuxième valeur ne se met à jour qu'une fois que vous quittez la TextBox et la troisième valeur se met à jour automatiquement à chaque frappe, changement de texte, etc.
Résumé
La propriété UpdateSourceTrigger d'un binding contrôle comment et quand une modification de valeur est renvoyée à la source. Cependant, étant donné que WPF est très bon pour contrôler ceci pour vous, la valeur par défaut devrait suffire dans la plupart des cas, où vous obtiendrez un bon compromis entre une interface utilisateur constamment mise à jour et de bonnes performances.
Pour ces situations où vous avez besoin de plus de contrôle du processus, cette propriété vous sera très certainement utile. Prenez juste garde à ne pas mettre à jour la valeur source plus souvent que ce qui est réellement nécessaire. Si vous voulez plus de contrôle, vous pouvez utiliser l'option Explicit et ensuite faire les mises à jour manuellement, mais ça enlève un peu de l'intérêt de travailler avec les data bindings.