Behavior qu’es aquò ?

Ajouté par Alexandre Journaux il y a environ 3 ans

Dans ce post, je vais vous montrer qu'est ce qu'un Behavior et comment on peut l'utiliser.
Tout d'abord un Behavior c'est un comportement qu'on va ajouter à un objet Xaml. Les objets Xaml ont tous un comportement par défaut. L'idée est donc de modifier ce comportement par défaut.

Prenons un exemple : on veut modifier la couleur de fond d'un Entry quand il récupère le fucus.

Dans les Windows Forms, on utiliserait l'évènement Focused de l'objet TextBox
Dans Xamarin.Forms, on pourrait utiliser l'attribut Focused de la balise Xaml Entry de cette façon :

<Entry Placeholder="Numéro animal" Text="{Binding AnimalNumero}" Keyboard="Numeric" Focused="Entry_Focused">

Mais ce n'est pas une bonne idée car on écrirait alors dans le code behind de la vue. Ce qui casserait notre cher modèle MVVM.
Et c'est donc là que nous allons écrire une classe Behavior.
Une classe Behavior est une classe qui doit hériter de Behavior. Nous allons donc hériter de cette classe en la typant avec notre objet Entry:
public class EntryBehavior : Behavior<Entry>

Ensuite, on va attacher cette classe au comportement qu'on veut modifier (Focused et Unfocused). Pour cela on va écrire le code ci-dessous :
protected override void OnAttachedTo(Entry bindable)
{
    bindable.Focused += Bindable_Focused;
    bindable.Unfocused += Bindable_Unfocused;
}

protected override void OnDetachingFrom(Entry bindable)
{
    bindable.Focused -= Bindable_Focused;
    bindable.Unfocused -= Bindable_Unfocused;
}

Il ne reste plus qu'à coder les méthodes Bindable_Focused et Bindable_Unfocused :
private void Bindable_Focused(object sender, FocusEventArgs e)
{
    Entry entry = (Entry)sender;
    entry.BackgroundColor = Color.LightBlue;
}

private void Bindable_Unfocused(object sender, FocusEventArgs e)
{
    Entry entry = (Entry)sender;
    entry.BackgroundColor = Color.Default;
}

Maintenant, retournons au fichier Xaml pour dire à l'objet qu'on va lui modifier son comportement avec la classe que nous venons de créer.
Dans l'en-tête du xaml, ajout d'un nouvel alias pour renseigner le namespace de la classe :

<ContentPage ...
             xmlns:behaviors="clr-namespace:PetitProgramme.Behaviors" 
             ... >

Et au niveau de la balise Entry ajout de notre Behavior dans la propriété Entry.Behaviors

<Entry Placeholder="Numéro animal" Text="{Binding AnimalNumero}" Keyboard="Numeric">
    <Entry.Behaviors>
        <behaviors:EntryBehavior/>
    </Entry.Behaviors>
</Entry>

Et voilà, c'est fait ;-)

focus_unfocus.jpg (56,066 ko)