Le DataBinding est un outil très répandu et facilement utilisable en WPF. Cet outil permet de lier des données d'une couche métier à la couche de l'interface utilisateur. On peut aisément coupler une liste d'objets métiers aux items d'une ListBox et WPF s'occupe d'habiller le composant ainsi que chacune de ses items.

On peut demander à WPF de mettre à jour l'interface, à chaque modification de l'objet source. Pour cela on à 2 possibilités, soit on passe par la réflexion de .Net, soit en déclarant des Dependency Property. La réflexion s'utilise en implémentant l'interface INotifyPropertyChanged et déclenche l'event PropertyChanged à chaque fois qu'une propriété est modifiée.

Les Dependency Properties sont utilisables dans des Dependency Objects. Cette classe est la base d'un très grand nombre de classe de WPF. Les Dependency Properties permettent aux objets qui les détiennent, d'avoir des propriétés dont la valeur peut dépendre de nombreuses choses. En effet, elles peuvent dépendre d'un DataBinding ou d'une animation. De plus elles fournissent un support pour ce qui est de l'auto-validation ou de la gestion des valeurs par défaut. Les classes dérivées peuvent modifier très facilement le comportement d'une DependencyProperty héritée.

Déclarer une DependencyProperty

Avant toute chose, il faut savoir que la déclaration d'une DependencyProperty est soumise à quelques contraintes. En effet, elle doivent respectées cette synthaxe :

DependencyProperty_declaration_2.bmp

On peut déclarer de différentes manières une DependencyProperty. Nous allons voir la plus utilisée et la plus simple :

DependencyProperty_declaration_1.bmp

On enregistre dans un dictionnaire la propriété grâce à la méthode statique DependencyProperty.Register(). Cette méthode peut prendre de 3 à 5 paramètres.

  1. On donne la clé du dictionnaire sous forme de string qui sera le nom de la propriété tronquée de "Property". (string)
  2. On précise le type de la propriété. (Type)
  3. On précise le type de l'objet qui la déclare. (Type)
  4. (facultatif) On créé des métadonnées qui définirons le comportement de la propriété. (PropertyMetadata)
  5. (facultatif) On référence un rappel qui doit exécuter toute validation personalisé de la valeur de la propriété de référence, au delà de la validation de type standard. (ValidateValueCallBack).

Les deux derniers paramètres requièrent des méthodes d'extensions qui doivent être statiques, vue q'une Dependency Property l'est aussi. Voici à quoi ressemble la déclaration de ces 2 méthodes :

DependencyProperty_declaration_3.bmp

Afin de rendre les Dependency Porperties complètement transparentes dans une classe, on les encapsule dans des propriétés CLR. Cette encapsulation nous permet donc de pouvoir appliquer le DataBinding. La classe qui permet d'encapsuler les Dependency Properties, doit hériter de DependencyObject. En dérivant de cette classe on peut utiliser les méthodes GetValue et SetValue. Voici le code d'encapsulation :

Encapsulation d'une DependencyProperty

La méthode GetValue revoie un object on doit donc obligatoirement caster son retour par le type approprié, i.e. le 2e paramètre de la méthode statique Register. On note également que la propriété CLR doit respecter la synthaxe de la clé passé dans le dictionnaire lors de l'enregistrement.