Share via


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

Cette rubrique décrit les propriétés de dépendance en lecture seule, y compris 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

Cette rubrique part du principe que vous comprenez les scénarios de base de l’implémentation d’une propriété de dépendance et que vous savez comment les métadonnées sont appliquées à une propriété de dépendance personnalisée. Pour plus d’informations sur le contexte, consultez Propriétés de dépendance personnalisées et Métadonnées de propriété de dépendance.

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

Certaines des propriétés de dépendance définies dans l’infrastructure WPF (Windows Presentation Foundation) sont en lecture seule. En règle générale, vous définissez des propriétés de dépendance en lecture seule parce qu’elles doivent être utilisées pour déterminer des états. Toutefois, quand l’état est influencé par plusieurs facteurs, le simple fait de définir la propriété sur cet état n’est pas souhaitable du point de vue de la conception de l’interface utilisateur. Par exemple, la propriété IsMouseOver n’est vraiment qu’un état de surface déterminé à partir de l’entrée de la souris. Si vous tentez de définir cette valeur par programmation en contournant la vraie entrée de souris, vous obtenez un comportement imprévisible qui entraîne une incohérence.

Parce qu’elles ne sont pas définissables, les propriétés de dépendance en lecture seule ne sont pas appropriées dans de nombreux scénarios pour lesquels les propriétés de dépendance offrent normalement une solution (à savoir : liaison de données, style applicable directement à une valeur, validation, animation, héritage). Bien qu’elles ne soient pas définissables, les propriétés de dépendance en lecture seule offrent néanmoins des fonctionnalités supplémentaires prises en charge par les propriétés de dépendance dans le système de propriétés. La fonctionnalité restante la plus importante est que la propriété de dépendance en lecture seule peut toujours être utilisée comme déclencheur de propriété dans un style. Vous ne pouvez pas activer les déclencheurs avec une propriété CLR (Common Language Runtime) normale ; il doit s’agir d’une propriété de dépendance. La propriété mentionnée ci-dessus IsMouseOver est un exemple parfait d’un scénario où il peut être très utile de définir un style pour un contrôle, où certaines propriétés visibles telles qu’un arrière-plan, un premier plan ou des propriétés similaires d’éléments composites au sein du contrôle changent lorsque l’utilisateur place une souris sur une région définie de votre contrôle. Les changements d’une propriété de dépendance en lecture seule peuvent aussi être détectés et signalés par les processus d’invalidation inhérents au système de propriétés, la fonctionnalité de déclencheur de propriété étant prise en charge en interne.

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

Lisez attentivement la section ci-dessus qui explique pourquoi les propriétés de dépendance en lecture seule ne fonctionnent pas dans de nombreux scénarios de propriété de dépendance classiques. Toutefois, si vous avez un scénario approprié, vous pouvez créer votre propre propriété de dépendance en lecture seule.

Une grande partie du processus de création d’une propriété de dépendance en lecture seule est identique à celui décrit dans les rubriques Propriétés de dépendance personnalisées et Implémenter une propriété de dépendance. Il existe trois différences majeures :

  • Lors de l’inscription de votre propriété, appelez la RegisterReadOnly méthode au lieu de la méthode normale Register pour l’inscription de propriété.

  • Lors de l’implémentation de la propriété CLR « wrapper », assurez-vous que le wrapper n’a pas également d’implémentation définie, afin qu’il n’y ait aucune incohérence dans l’état en lecture seule pour le wrapper public que vous exposez.

  • L’objet retourné par l’inscription en lecture seule est DependencyPropertyKey plutôt que DependencyProperty. Vous devez toujours stocker ce champ sous forme de membre, mais, en général, vous ne le convertissez pas en membre public du type.

Indépendamment de la valeur ou champ privé que vous utilisez, le stockage de votre propriété de dépendance en lecture seule peut être entièrement inscriptible en utilisant la logique de votre choix. Toutefois, la façon la plus simple de définir la propriété initialement ou dans le cadre de la logique d’exécution consiste à utiliser les API du système de propriétés, au lieu de contourner le système de propriétés et de définir directement le champ de stockage privé. En particulier, il existe une signature qui SetValue accepte un paramètre de type DependencyPropertyKey. Comment et où vous définissez cette valeur par programmation dans votre logique d’application affectera la façon dont vous souhaiterez peut-être définir l’accès sur la propriété de dépendance créée lors de la DependencyPropertyKey première inscription de la propriété de dépendance. Si vous gérez cette logique entièrement dans la classe, vous pouvez indiquer qu’elle est privée ou, si vous voulez qu’elle soit définie à partir d’autres parties de l’assembly, vous pouvez la définir en interne. Une approche consiste à appeler SetValue dans un gestionnaire d’événements de classe d’un événement pertinent qui informe une instance de classe que la valeur de propriété stockée doit être modifiée. Une autre approche consiste à lier les propriétés de dépendance en utilisant des rappels et CoerceValueCallback jumelés PropertyChangedCallback dans le cadre des métadonnées de ces propriétés lors de l’inscription.

Étant donné que l’élément DependencyPropertyKey est privé et n’est pas propagé par le système de propriétés en dehors de votre code, une propriété de dépendance en lecture seule a une meilleure sécurité de définition qu’une propriété de dépendance en lecture-écriture. Pour une propriété de dépendance en lecture-écriture, le champ d’identification est explicitement ou implicitement public et la propriété est donc largement définissable. Pour plus d’informations, consultez Sécurité de propriété de dépendance.

Voir aussi