Partage via


Propriétés de dépendance

Remarque

Ce contenu est réimprimé avec l’autorisation de Pearson Education, Inc. à partir des Instructions de conception d’une infrastructure : conventions, idiomes et modèles des bibliothèques réutilisables .NET, 2ème édition. Cette édition a été publiée en 2008, et le livre a été entièrement révisé dans la troisième édition. Certaines informations de cette page peuvent être obsolètes.

Une propriété de dépendance est une propriété normale qui stocke sa valeur dans un magasin de propriétés au lieu de la stocker dans une variable de type (champ), par exemple.

Une propriété de dépendance attachée est une sorte de propriété de dépendance modélisée sous forme de méthodes Get et Set statiques représentant des « propriétés » décrivant les relations entre les objets et leurs conteneurs (par exemple, la position d’un objet Button sur un conteneur Panel).

✔️ FOURNISSEZ les propriétés de dépendance, si vous en avez besoin pour prendre en charge des fonctionnalités WPF comme les styles, les déclencheurs, la liaison de données, les animations, les ressources dynamiques et l’héritage.

Conception des propriétés de dépendance

✔️ HÉRITEZ de DependencyObject ou de l’un de ses sous-types, lors de l’implémentation de propriétés de dépendance. Le type fournit une implémentation très efficace d’un magasin de propriétés et prend automatiquement en charge la liaison de données WPF.

✔️ FOURNISSEZ une propriété CLR normale et un champ statique public en lecture seule stockant un instance de System.Windows.DependencyProperty pour chaque propriété de dépendance.

✔️ IMPLÉMENTEZ des propriétés de dépendance en appelant les méthodes d’instance DependencyObject.GetValue et DependencyObject.SetValue.

✔️ NOMMEZ le champ statique de la propriété de dépendance en ajoutant le suffixe « Property » au nom de la propriété.

❌ NE DÉFINISSEZ PAS les valeurs par défaut des propriétés de dépendance explicitement dans le code. Définissez-les plutôt dans les métadonnées.

Si vous définissez explicitement la valeur par défaut d’une propriété, vous risquez d’empêcher cette propriété d’être définie par certains moyens implicites, comme l’application d’un style.

❌ NE PLACEZ PAS de code dans les accesseurs de propriété autres que le code standard pour accéder au champ statique.

Ce code ne s’exécute pas si la propriété est définie par des moyens implicites, comme l’application d’un style, car le style utilise directement le champ statique.

❌ N’UTILISEZ PAS les propriétés de dépendance pour stocker des données sécurisées. Même les propriétés de dépendance privées sont accessibles publiquement.

Conception des propriétés de dépendance attachées

Les propriétés de dépendance décrites dans la section précédente représentent des propriétés intrinsèques du type déclarant. Par exemple, la propriété Text est une propriété de TextButton, qui la déclare. Une propriété de dépendance attachée est un type spécial de propriété de dépendance.

La propriété Grid.Column est un exemple classique de propriété attachée. La propriété représente la position de colonne de Button (et non de Grid), mais elle n’est pertinente que si Button est contenu dans GRID, et elle est donc « attachée » à Buttons par Grids.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0">Click</Button>
    <Button Grid.Column="1">Clack</Button>
</Grid>

La définition d’une propriété attachée est quasiment la même que celle d’une propriété de dépendance normale, à ceci près que les accesseurs sont représentés par des méthodes Get et Set statiques :

public class Grid {

    public static int GetColumn(DependencyObject obj) {
        return (int)obj.GetValue(ColumnProperty);
    }

    public static void SetColumn(DependencyObject obj, int value) {
        obj.SetValue(ColumnProperty,value);
    }

    public static readonly DependencyProperty ColumnProperty =
        DependencyProperty.RegisterAttached(
            "Column",
            typeof(int),
            typeof(Grid)
    );
}

Validation des propriétés de dépendance

Les propriétés implémentent souvent une validation. La logique de validation s’exécute lorsqu’une tentative de modification de la valeur d’une propriété est effectuée.

Malheureusement, les accesseurs de propriété de dépendance ne peuvent pas contenir de code de validation arbitraire. La logique de validation des propriétés de dépendance a plutôt besoin d’être spécifiée lors de l’inscription des propriétés.

❌ NE PLACEZ PAS la logique de validation des propriétés de dépendance dans les accesseurs des propriétés. Passez plutôt un rappel de validation à la méthode DependencyProperty.Register.

Notifications de modification de propriétés de dépendance

❌ N’IMPLÉMENTEZ PAS la logique de notification de modification dans les accesseurs des propriétés de dépendance. Les propriétés de dépendance ont une fonctionnalité intégrée de notification de modification qui doit être utilisée en fournissant un rappel de notification de modification à PropertyMetadata.

Forçage de la valeur d’une propriété de dépendance

Un forçage de propriété a lieu lorsque la valeur donnée à un setter de propriété est modifiée par le setter avant que le magasin de propriétés ne soit réellement modifié.

❌ N’IMPLÉMENTEZ PAS la logique de forçage dans les accesseurs des propriétés de dépendance.

Les propriétés de dépendance ont une fonctionnalité de forçage intégrée, qui peut être utilisée en fournissant un rappel de forçage à PropertyMetadata.

Portions © 2005, 2009 Microsoft Corporation. Tous droits réservés.

Réimprimé avec l’autorisation de Pearson Education, Inc. et extrait de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition par Krzysztof Cwalina et Brad Abrams, publié le 22 octobre 2008 par Addison-Wesley Professional dans le cadre de la série sur le développement Microsoft Windows.

Voir aussi