Partager via


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 :

  1. Le délégué propertyChanged caste la référence du contrôle, qui est reçue comme BindableObject, en type de contrôle que le comportement est conçu pour améliorer.
  2. 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 :

Exemple d’application avec comportement attaché

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.