Propriétés de dépendance en lecture seule (WPF .NET)

Vous pouvez utiliser des propriétés de dépendance en lecture seule pour empêcher la définition de valeurs de propriété en dehors de votre code. Cet article décrit les propriétés de dépendance en lecture seule existantes et les scénarios et techniques de création d’une propriété de dépendance en lecture seule personnalisée.

Prérequis

L’article suppose une connaissance de base des propriétés de dépendance et que vous avez lu la vue d’ensemble des propriétés de dépendance. Pour suivre les exemples de cet article, il vous aide à connaître le langage XAML (Extensible Application Markup Language) et à savoir comment écrire des applications WPF.

Propriétés de dépendance en lecture seule existantes

Les propriétés de dépendance en lecture seule indiquent généralement l’état du rapport et ne doivent pas être modifiables par le biais d’un public accesseur. Par exemple, l’infrastructure WPF (Windows Presentation Foundation) implémente la IsMouseOver propriété en lecture seule, car sa valeur ne doit être déterminée que par l’entrée de la souris. Si IsMouseOver d’autres entrées sont autorisées, sa valeur peut devenir incohérente avec l’entrée de la souris. Bien qu’elles ne soient pas définis par le biais d’un public accesseur, de nombreuses propriétés de dépendance en lecture seule existantes ont des valeurs déterminées par plusieurs entrées.

Utilisations de propriétés de dépendance en lecture seule

Les propriétés de dépendance en lecture seule ne sont pas applicables dans plusieurs scénarios où les propriétés de dépendance offrent normalement une solution. Les scénarios non applicables incluent la liaison de données, l’application d’un style à une valeur, à la validation, à l’animation et à l’héritage. Toutefois, une propriété de dépendance en lecture seule peut être utilisée comme déclencheur de propriété dans un style. Par exemple, IsMouseOver il est couramment utilisé pour déclencher les modifications apportées à l’arrière-plan, au premier plan ou à une autre propriété visible d’un contrôle lorsque la souris est sur celle-ci. Le système de propriétés WPF détecte et signale les modifications apportées aux propriétés de dépendance en lecture seule, ce qui prend en charge les fonctionnalités de déclencheur de propriété. Les propriétés de dépendance en lecture seule sont également utiles lors de l’implémentation d’une propriété de dépendance de type collection, où seuls les éléments de collection doivent être accessibles en écriture, et non l’objet de collection lui-même. Pour plus d’informations, consultez propriétés de dépendance de type Collection.

Remarque

Seules les propriétés de dépendance, et non les propriétés common language runtime, peuvent être utilisées comme déclencheurs de propriété dans un style.

Création de propriétés de dépendance en lecture seule personnalisées

Avant de créer une propriété de dépendance en lecture seule, vérifiez les scénarios non applicables.

Le processus de création d’une propriété de dépendance en lecture seule est similaire à la création de propriétés de dépendance en lecture-écriture, avec ces distinctions :

  • Lors de l’inscription de votre propriété en lecture seule, appelez RegisterReadOnly au lieu de Register.

  • Lors de l’implémentation du wrapper de propriété CLR, vérifiez qu’il n’a pas d’accesseur public set .

  • RegisterReadOnly retourne DependencyPropertyKey au lieu de DependencyProperty. Stockez le DependencyPropertyKey fichier dans un membre de classe non public.

Vous pouvez déterminer la valeur de votre propriété de dépendance en lecture seule à l’aide de la logique choisie. La méthode recommandée pour définir la valeur de propriété, initialement ou dans le cadre de la logique d’exécution, consiste à utiliser la surcharge qui SetValue accepte un paramètre de type DependencyPropertyKey. L’utilisation SetValue est préférable pour contourner le système de propriétés et définir directement le champ de stockage.

Comment et où vous définissez la valeur d’une propriété de dépendance en lecture seule au sein de votre application affecte le niveau d’accès que vous affectez au membre de classe qui stocke le DependencyPropertyKey. Si vous définissez uniquement la valeur de propriété à partir de la classe qui inscrit la propriété de dépendance, vous pouvez utiliser un modificateur d’accès private . Pour les scénarios où les valeurs des propriétés de dépendance affectent les unes les autres, vous pouvez utiliser des rappels et CoerceValueCallback jumelés PropertyChangedCallback pour déclencher des modifications de valeur. Pour plus d’informations, consultez les métadonnées de propriété de dépendance.

Si vous devez modifier la valeur d’une propriété de dépendance en lecture seule en dehors de la classe qui l’inscrit, vous pouvez utiliser un modificateur d’accès internal pour le DependencyPropertyKey. Par exemple, vous pouvez appeler SetValue à partir d’un gestionnaire d’événements dans le même assembly. L’exemple suivant définit une classe Aquarium qui appelle RegisterReadOnly pour créer la propriété FishCountde dépendance en lecture seule . Le DependencyPropertyKey champ est affecté à un internal static readonly champ afin que le code dans le même assembly puisse modifier la valeur de propriété de dépendance en lecture seule.

public class Aquarium : DependencyObject
{
    // Register a dependency property with the specified property name,
    // property type, owner type, and property metadata.
    // Assign DependencyPropertyKey to a nonpublic field.
    internal static readonly DependencyPropertyKey FishCountPropertyKey =
        DependencyProperty.RegisterReadOnly(
          name: "FishCount",
          propertyType: typeof(int),
          ownerType: typeof(Aquarium),
          typeMetadata: new FrameworkPropertyMetadata());

    // Declare a public get accessor.
    public int FishCount =>
        (int)GetValue(FishCountPropertyKey.DependencyProperty);
}
Public Class Aquarium
    Inherits DependencyObject

    ' Register a dependency property with the specified property name,
    ' property type, owner type, And property metadata.
    ' Assign DependencyPropertyKey to a nonpublic field.
    Friend Shared ReadOnly FishCountPropertyKey As DependencyPropertyKey =
        DependencyProperty.RegisterReadOnly(
            name:="FishCount",
            propertyType:=GetType(Integer),
            ownerType:=GetType(Aquarium),
            typeMetadata:=New FrameworkPropertyMetadata())

    ' Declare a public get accessor.
    Public ReadOnly Property FishCount As Integer
        Get
            Return GetValue(FishCountPropertyKey.DependencyProperty)
        End Get
    End Property

End Class

Étant donné que le système de propriétés WPF ne propage pas l’extérieur DependencyPropertyKey de votre code, les propriétés de dépendance en lecture seule ont une meilleure sécurité d’écriture que les propriétés de dépendance en lecture-écriture. Utilisez une propriété de dépendance en lecture seule lorsque vous souhaitez limiter l’accès en écriture à ceux qui ont une référence au DependencyPropertyKey.

En revanche, l’identificateur de propriété de dépendance pour les propriétés de dépendance en lecture-écriture est accessible via le système de propriétés, quel que soit le modificateur d’accès que vous lui affectez. Pour plus d’informations, consultez La sécurité des propriétés de dépendance.

Voir aussi