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
:
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é CLRdeclaringType
: 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 validepropertyChanging
: rappel pour indiquer quand la propriété est sur le point de changercoerceValue
: rappel pour forcer une valeur définie à une autre valeurdefaultValueCreate
: 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 .