WPF – Implémentation et utilisation des propriétés de dépendance

Présentation
Les propriétés de dépendance sont utilisées dans tous composants WPF. Ces propriétés, différentes des propriétés standards utilisées habituellement dans les classes C#, permettent de mettre en œuvre de nombreuses fonctionnalités de WPF qui ne peuvent utiliser ces propriétés standards (propriétés attachées, styles, animations, liaisons de données, …). Elles possèdent les caractéristiques suivantes :

  • Faible encombrement mémoire, car seules les propriétés modifiées y sont stockées
  • L’évaluation de leur valeur est dynamique et cette valeur peut provenir de sources de données différentes (et même être héritée dans l’arborescence des contrôles pour un contrôle WPF)
  • Propose un mécanisme intégré permettant de notifier que leur valeur a été modifiée

Exemple
Voici un exemple de liaison de données, qui permet de lier la propriété Libelle de l’objet présent dans le contexte de données (DataContext) à la propriété Content du contrôle Label :

<Label Content="{Binding Libelle}" />

Cette liaison est possible car Content est une propriété de dépendance. Ainsi lors de l’exécution de ce code, le libellé d’un objet est affiché et si la propriété Libelle est mise à jour, alors le contenu du contrôle Label est rafraichi de manière automatique.

Implémentation d’une propriété de dépendance
Pour exploiter les fonctionnalités WPF dans les classes, il est nécessaire de définir des propriétés de dépendance. Pour ce faire, la classe doit hériter de la classe DependencyObject du Framework .NET.
Par exemple, elles sont utilisées dans les contrôles utilisateurs WPF. Ces contrôles héritent de la classe UserControl (qui hérite de la classe DependencyObject). Dans l’exemple présenté ci-dessous :

public partial class ScoreTest : UserControl
{
    public ScoreTest()
    {
        InitializeComponent();
        slider.DataContext = this;
    }

    public int Valeur
    {
        get { return (int)GetValue(ValeurProperty); }
        set { SetValue(ValeurProperty, value); }
    }

    public static readonly DependencyProperty ValeurProperty =
        DependencyProperty.Register(
            nameof(ScoreTest.Valeur),
            typeof(int),
            typeof(ScoreTest),
            new PropertyMetadata(0)
    );
}

Les méthodes GetValue et SetValue ont des méthodes héritées de la classe DependencyObject. La méthode Register de la classe DependencyProperty permet d’enregistrer la propriété Valeur en tant que propriété de dépendance.

Utilisation d’une propriété de dépendance
Mettons en œuvre l’utilité des propriétés de dépendance au travers des liaisons de données. Dans l’interface graphique du contrôle utilisateur, ajoutons un contrôle Slider permettant de visualiser et modifier la valeur de la propriété de dépendance Valeur au travers d’un curseur :

<Slider x:Name="slider"
       HorizontalAlignment="Left"
       Margin="10,10,0,0"
       VerticalAlignment="Top"
       Width="499"
       Minimum="0"
       Maximum="100"
       Value="{Binding Path=Valeur, Mode=TwoWay}" />

La markup extension Binding permet de lier la propriété de dépendance Valeur à la propriété Value du contrôle Silder.

Puis, utilisons ce contrôle dans un formulaire WPF :

<local:ScoreTest x:Name="CtrlScore"
                    Height="45"
                    Margin="10,10,434,364" />
<Label Content="Valeur :"
       HorizontalAlignment="Left"
       Margin="56,62,0,0"
       VerticalAlignment="Top" />
<TextBox x:Name="TxtValeur"
         Text="{Binding Path=Valeur, ElementName=CtrlScore, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         HorizontalAlignment="Left"
         Height="19"
         Margin="110,66,0,0"
         TextWrapping="Wrap"
         VerticalAlignment="Top"
         Width="50" />

La markup extension Binding permet de lier la propriété de dépendance Valeur du contrôle utilisateur à la propriété Text du contrôle TextBox. Lors de la modification de la valeur dans le contrôle TextBox du formulaire, la propriété Valeur du contrôle utilisateur ScoreTest est mise à jour, puis la valeur du contrôle Slider est aussi mise à jour. Etant donné que les liaisons de données sont implémentées en mode TwoWay (autrement dit, de manière bidirectionnelle), la valeur du contrôle TextBox est aussi mise à jour lorsque la position du curseur du contrôle Slider est modifiée.

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.