Partager via


Résumé du chapitre 11. Infrastructure pouvant être liée

Remarque

Ce livre a été publié au printemps 2016 et n’a pas été mis à jour depuis. Il y a beaucoup dans le livre qui reste précieux, mais certains documents sont obsolètes, et certains sujets ne sont plus entièrement corrects ou complets.

Chaque programmeur C# est familiarisé avec les propriétés C#. Les propriétés contiennent un accesseur set et/ou un accesseur get . Elles sont souvent appelées propriétés CLR pour Common Language Runtime.

Xamarin.Formsdéfinit une définition de propriété améliorée appelée propriété pouvant être liée encapsulée par la BindableProperty classe et prise en charge par la BindableObject classe. Ces classes sont liées mais assez distinctes : elle BindableProperty est utilisée pour définir la propriété elle-même ; BindableObject c’est comme object dans ce cas, il s’agit d’une classe de base pour les classes qui définissent des propriétés pouvant être liées.

Hiérarchie des Xamarin.Forms classes

L’exemple ClassHierarchy utilise la réflexion pour afficher une hiérarchie de classes et Xamarin.Forms illustrer le rôle crucial joué par BindableObject cette hiérarchie. BindableObject dérive de Object et est la classe parente à Element partir de laquelle VisualElement dérive. Il s’agit de la classe parente vers Page et View, qui est la classe parente à Layout:

Capture d’écran triple du partage de hiérarchie de classes

Aperçu de BindableObject et BindableProperty

Dans les classes qui dérivent de BindableObject nombreuses propriétés CLR, on dit qu’elles sont « sauvegardées par » des propriétés pouvant être liées. Par exemple, la Text propriété de la Label classe est une propriété CLR, mais la Label classe définit également un champ en lecture seule statique public nommé TextProperty de type BindableProperty.

Une application peut définir ou obtenir la Text propriété normalement Label , ou l’application peut la définir Text en appelant la SetValue méthode définie par BindableObject un Label.TextProperty argument. De même, une application peut obtenir la valeur de la Text propriété en appelant la GetValue méthode, à nouveau avec un Label.TextProperty argument. Ceci est illustré par l’exemple PropertySettings .

En effet, la Text propriété CLR est entièrement implémentée à l’aide des SetValue méthodes définies GetValue conjointement BindableObject avec la Label.TextProperty propriété statique.

BindableObject et BindableProperty fournir une prise en charge des points suivants :

  • Donner des valeurs par défaut aux propriétés
  • Stockage de leurs valeurs actuelles
  • Fourniture de mécanismes pour la validation des valeurs de propriété
  • Maintien de la cohérence entre les propriétés associées dans une classe unique
  • Réponse aux modifications des propriétés
  • Déclenchement de notifications lorsqu’une propriété est sur le point de changer ou a changé
  • Prise en charge de la liaison de données
  • Styles de prise en charge
  • Prise en charge des ressources dynamiques

Chaque fois qu’une propriété sauvegardée par une propriété pouvant être liée change, BindableObject déclenche un PropertyChanged événement identifiant la propriété qui a changé. Cet événement n’est pas déclenché lorsque la propriété est définie sur la même valeur.

Certaines propriétés ne sont pas sauvegardées par des propriétés pouvant être liées, et certaines Xamarin.Forms classes ( par Span exemple) ne dérivent pas de BindableObject. Seule une classe dérivée de BindableObject peut prendre en charge les propriétés pouvant être liées, car BindableObject définit les méthodes et GetValue les SetValue méthodes.

Étant donné que Span ne dérive pas de BindableObject, aucune de ses propriétés ( par Text exemple) n’est soutenue par une propriété pouvant être liée. C’est pourquoi un DynamicResource paramètre sur la Text propriété de déclenche Span une exception dans l’exemple DynamicVsStatic du chapitre précédent. L’exemple DynamicVsStaticCode montre comment définir des ressources dynamiques dans le code à l’aide de la SetDynamicResource méthode définie par Element. Le premier argument est un objet de type BindableProperty.

De même, la SetBinding méthode définie par BindableObject a un premier argument de type BindableProperty.

Définition des propriétés pouvant être liées

Vous pouvez définir vos propres propriétés pouvant être liées à l’aide de la méthode statique BindableProperty.Create pour créer un champ statique en lecture seule de type BindableProperty.

Ceci est illustré dans la AltLabel classe de la Xamarin.Formsbibliothèque Book.Toolkit. La classe dérive et vous permet de spécifier une taille de Label police en points. Il est illustré dans l’exemple PointSizedText .

Quatre arguments de la BindableProperty.Create méthode sont requis :

  • propertyName: nom de texte de la propriété (identique au nom de la propriété CLR)
  • returnType: type de la propriété CLR
  • declaringType: type de la classe déclarant la propriété
  • defaultValue: valeur par défaut de la propriété

Comme defaultValue il s’agit d’un type object, le compilateur doit être en mesure de déterminer le type de la valeur par défaut. Par exemple, si l’objet returnType est double, il defaultValue doit être défini sur quelque chose comme 0.0 plutôt que seulement 0, ou l’incompatibilité de type déclenche une exception au moment de l’exécution.

Il est également très courant d’inclure une propriété pouvant être liée :

  • propertyChanged: méthode statique appelée lorsque la propriété change de valeur. Le premier argument est l’instance de la classe dont la propriété a été modifiée.

Les autres arguments à BindableProperty.Create ne pas être aussi courants :

  • defaultBindingMode: utilisé dans le cadre de la liaison de données (comme indiqué dans le chapitre 16). Liaison de données)
  • validateValue: rappel permettant de vérifier une valeur valide
  • propertyChanging: rappel pour indiquer quand la propriété est sur le point de changer
  • coerceValue: rappel pour forcer une valeur définie à une autre valeur
  • defaultValueCreate: rappel pour créer une valeur par défaut qui ne peut pas être partagée entre les instances de la classe (par exemple, une collection)

Propriété pouvant être liée en lecture seule

Une propriété pouvant être liée peut être en lecture seule. La création d’une propriété pouvant être liée en lecture seule nécessite l’appel de la méthode BindableProperty.CreateReadOnly statique pour définir un champ statique en lecture seule privée de type BindablePropertyKey.

Ensuite, définissez l’accesor de propriété set CLR sur l’appel private d’une SetValue surcharge avec l’objet BindablePropertyKey . Cela empêche la définition de la propriété en dehors de la classe.

Ceci est illustré dans la CountedLabel classe utilisée dans l’exemple BaskervillesCount .