Comportements attachés
Les comportements attachés sont des classes avec une ou plusieurs propriétés attachées. Cet article montre comment créer et consommer des comportements attachés.
Vue d’ensemble
Les propriétés attachées constituent un type particulier de propriété liable. Elles sont définies dans une seule classe, mais attachées à d’autres objets. En XAML, elles sont reconnaissables car elles sont représentées sous forme d’attributs contenant un nom de classe et un nom de propriété séparés par un point.
Une propriété attachée peut définir un délégué propertyChanged
qui est exécuté quand la valeur de la propriété change, par exemple quand la propriété est définie sur un contrôle. Lorsque le délégué propertyChanged
s’exécute, il est passé comme référence au contrôle sur lequel il est actuellement attaché, tout comme les paramètres qui contiennent les valeurs anciennes et nouvelles de la propriété. Vous pouvez utiliser ce délégué pour ajouter de nouvelles fonctionnalités au contrôle auquel la propriété est attachée en manipulant la référence qui y est passée, comme suit :
- Le délégué
propertyChanged
caste la référence du contrôle, qui est reçue commeBindableObject
, en type de contrôle que le comportement est conçu pour améliorer. - Le délégué
propertyChanged
modifie les propriétés du contrôle, appelle les méthodes du contrôle ou inscrit les gestionnaires d’événements aux événements exposés par le contrôle, pour implémenter la fonctionnalité clé du comportement.
Le problème avec les comportements attachés est qu’ils sont définis dans une classe static
avec des méthodes et des propriétés static
. Il est donc difficile de créer des comportements attachés qui ont un état. En outre, Xamarin.Forms les comportements ont remplacé les comportements attachés comme approche préférée de la construction du comportement. Pour plus d’informations sur Xamarin.Forms les comportements, consultez Xamarin.Forms Comportements.
Création d’un comportement attaché
L’exemple d’application montre un NumericValidationBehavior
, qui met en évidence la valeur entrée par l’utilisateur dans un contrôle Entry
en rouge, si elle n’est pas un double
. Le comportement est illustré dans l’exemple de code suivant :
public static class NumericValidationBehavior
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached (
"AttachBehavior",
typeof(bool),
typeof(NumericValidationBehavior),
false,
propertyChanged:OnAttachBehaviorChanged);
public static bool GetAttachBehavior (BindableObject view)
{
return (bool)view.GetValue (AttachBehaviorProperty);
}
public static void SetAttachBehavior (BindableObject view, bool value)
{
view.SetValue (AttachBehaviorProperty, value);
}
static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
{
var entry = view as Entry;
if (entry == null) {
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior) {
entry.TextChanged += OnEntryTextChanged;
} else {
entry.TextChanged -= OnEntryTextChanged;
}
}
static void OnEntryTextChanged (object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse (args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
}
}
La classe NumericValidationBehavior
contient une propriété attachée nommée AttachBehavior
avec une méthode getter ou setter static
, qui contrôle l’ajout ou la suppression du comportement dans le contrôle auquel il est attaché. Cette propriété jointe inscrit la méthode OnAttachBehaviorChanged
qui est exécutée au changement de la valeur de la propriété. Cette méthode inscrit ou désinscrit un gestionnaire d’événements pour l’événement TextChanged
, selon la valeur de la propriété attachée AttachBehavior
. La fonctionnalité clé du comportement est fournie par la méthode OnEntryTextChanged
, qui analyse la valeur entrée dans l’Entry
par l’utilisateur et définit la propriété TextColor
sur rouge si la valeur n’est pas un double
.
Consommation d’un comportement attaché
Vous pouvez consommer la classe NumericValidationBehavior
en ajoutant la propriété attachée AttachBehavior
à un contrôle Entry
, comme illustré dans l’exemple de code XAML suivant :
<ContentPage ... xmlns:local="clr-namespace:WorkingWithBehaviors;assembly=WorkingWithBehaviors" ...>
...
<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="true" />
...
</ContentPage>
Le contrôle Entry
équivalent en C# est présenté dans l’exemple de code suivant :
var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, true);
Lors de l’exécution, le comportement répond à l’interaction avec le contrôle en fonction de l’implémentation de comportement. Les captures d’écran suivantes illustrent le comportement attaché répondant à une entrée non valide :
Remarque
Les comportements attachés sont écrits pour un type de contrôle spécifique (ou une superclasse qui peut s’appliquer à de nombreux contrôles) et doivent être ajoutés à un contrôle compatible uniquement. La tentative d’attachement d’un comportement à un contrôle incompatible entraîne un comportement inconnu et dépend de l’implémentation de comportement.
Suppression d’un comportement attaché d’un contrôle
Vous pouvez supprimer la classe NumericValidationBehavior
d’un contrôle en définissant la propriété attachée AttachBehavior
sur false
, comme illustré dans l’exemple de code XAML suivant :
<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="false" />
Le contrôle Entry
équivalent en C# est présenté dans l’exemple de code suivant :
var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, false);
Lors de l’exécution, la méthode OnAttachBehaviorChanged
est exécutée quand la valeur de la propriété attachée AttachBehavior
est définie sur false
. La méthode OnAttachBehaviorChanged
désinscrit le gestionnaire d’événements pour l’événement TextChanged
pour garantir que le comportement n’est pas exécuté quand l’utilisateur interagit avec le contrôle.
Résumé
Cet article a montré comment créer et consommer des comportements attachés. Les comportements joints sont des classes static
avec une ou plusieurs propriétés jointes.