septembre
2012
Introduction
Le data binding en WPF est un processus qui permet de lier une propriété d’un objet source à une propriété d’un objet cible. Cela se fait aisément avec le langage XAML. Mais il y a des cas où le code XAML ne suffit pas. C’est le cas par exemple où l’on doit pouvoir ajouter ou supprimer dynamiquement le binding.
Préparation
Pour cet exercice nous allons créer un projet WPF et y ajouter quelques contrôles de la façon suivante :
- Lancer Visual Studio et Créer un projet de type WPF Application.
- Dans l’explorateur de solution (Solution Explorer), double cliquer sur MainWindow.xaml pour ouvrir le designer XAML.
- Ajouter un contrôle Slider nommé slider1.
- Ajouter un contrôle Label nommé label1.
- Ajouter un contrôle CheckBox nommé checkBox1.
Binding par XAML
Dans cette partie, nous allons faire le binding avec du XAML. Le but ici est de lier la propriété Value du Slider à la propriété Content du Label.
Pour réaliser cela, il faut remplacer la valeur de la propriété Content du Label, ce qui donne :
Compiler et exécuter l’application, changer la valeur du Slider et vous allez voir le contenu du Label changé automatiquement.
Binding par code C#
Ici ce que nous allons faire, c’est d’ajouter le data binding seulement si la CheckBox est coché et sinon supprimer le data binding.
D’où l’importance du binding par code car cela nous permet d’ajouter ou supprimer dynamiquement le binding entre deux éléments.
Pour réaliser cela, commencer par supprimer la propriété Content du Label et double cliquer sur le contrôle Window (là où le texte MainWindow est écrit dans le designer) pour implémenter la méthode Loaded.
Juste au dessus de la ligne private void Window_Loaded(object sender, RoutedEventArgs e) ajouter un attribut de type Binding à la classe MainWindow avec la ligne suivante :
Dans le code de la méthode Window_Loaded ajouter les lignes suivantes :
MyBinding.ElementName = "slider1";
MyBinding.Path = new PropertyPath("Value");
// On ajoute le binding au lancement de la fenêtre
// en ajoutant la ligne suivante
label1.SetBinding(ContentProperty, MyBinding);
Compiler et exécuter votre application et vous allez retrouver les même fonctionnalités que dans la partie précédente.
Pour la gestion de notre CheckBox nous allons ajouter ces deux lignes dans la méthode Window_Loaded
checkBox1.Unchecked += new RoutedEventHandler(checkBox1_Unchecked);
Ajouter ces deux méthodes après la méthode Window_Loaded :
{
}
void checkBox1_Checked(object sender, RoutedEventArgs e)
{
}
Maintenant à quoi servent ces deux méthodes ?
La première (checkBox1_Unchecked) sera exécutée quand vous cliquez sur la CheckBox pour la décocher et la seconde (checkBox1_Checked) sera executée quand vous cliquez sur la CheckBox pour la cocher.
Pour la première méthode nous allons supprimer le binding. Pour cela, nous allons faire appel à la méthode BindingOperations.ClearBinding comme ceci :
Ajouter cette ligne dans la méthode checkBox1_Unchecked.
Pour la méthode checkBox1_Checked nous allons ajouter cette ligne :
Compiler et exécuter la solution (vous pouvez mettre en commentaire la ligne label1.SetBinding(ContentProperty, MyBinding); dans la méthode Window_Loaded pour ne pas ajouter de binding au chargement de la fenêtre), Cocher, Décocher la CheckBox, Changer la valeur du Slider et voilà.
Conclusion
Utiliser le XAML pour spécifier le binding est fort utile, mais il y a des cas où le faire par code reste une bien meilleure solution. Il faut donc être à l’aise avec le binding par XAML et par code.