Comportamenti associati

I comportamenti associati sono classi statiche con una o più proprietà associate. Questo articolo illustra come creare e usare i comportamenti associati.

Panoramica

Le proprietà associate sono un tipo speciale di proprietà associabili. Sono definite in una classe ma associate ad altri oggetti. Sono riconoscibili in XAML perché si presentano come attributi che contengono una classe e un nome di proprietà separati da un punto.

Una proprietà associata può definire un delegato propertyChanged che verrà eseguito quando cambia il valore della proprietà, ad esempio quando la proprietà è impostata su un controllo. Quando viene eseguito, il delegato propertyChanged passa un riferimento al controllo a cui è associato e ai parametri che contengono i valori vecchi e nuovi della proprietà. Questo delegato può essere utilizzato per aggiungere nuove funzionalità al controllo a cui la proprietà è associata modificando il riferimento con cui viene passato, come indicato di seguito:

  1. Il delegato propertyChanged esegue il cast del riferimento del controllo, ricevuto come BindableObject, convertendolo nel tipo di controllo che il comportamento è progettato per migliorare.
  2. Il delegato propertyChanged modifica le proprietà del controllo, chiama i metodi del controllo o registra i gestori di eventi per gli eventi esposti dal controllo allo scopo di implementare le funzionalità del comportamento di base.

Un problema che può sorgere con comportamenti associati è che sono definiti in una classe static con proprietà e metodi di tipo static. Ciò rende difficile creare comportamenti associati che presentano uno stato. Inoltre, Xamarin.Forms i comportamenti hanno sostituito i comportamenti associati come approccio preferito alla costruzione del comportamento. Per altre informazioni sui Xamarin.Forms comportamenti, vedere Xamarin.Forms Comportamenti.

Creazione di un comportamento associato

L'applicazione di esempio illustra un NumericValidationBehavior, che evidenzia in rosso il valore immesso dall'utente in un controllo Entry, se non ha valore double. Il comportamento è illustrato nell'esempio di codice riportato di seguito:

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 contiene una proprietà associata denominata AttachBehavior con un getter e un setter static, che controlla l'aggiunta o la rimozione del comportamento del controllo a cui verrà associata. Tale proprietà associata registra il metodo OnAttachBehaviorChanged che verrà eseguito quando cambia il valore della proprietà. Questo metodo registra, o annulla la registrazione di, un gestore eventi per l'evento TextChanged, in base al valore della proprietà associata AttachBehavior. La funzionalità di base del comportamento è fornita dal metodo OnEntryTextChanged, che analizza il valore immesso nel controllo Entry dall'utente e imposta la proprietà TextColor su rosso se il valore non è double.

Uso di un comportamento associato

La classe NumericValidationBehavior può essere usata aggiungendo la proprietà associata AttachBehavior a un controllo Entry, come illustrato nell'esempio di codice XAML seguente:

<ContentPage ... xmlns:local="clr-namespace:WorkingWithBehaviors;assembly=WorkingWithBehaviors" ...>
    ...
    <Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="true" />
    ...
</ContentPage>

Il codice C# equivalente per Entry è visualizzato nell'esempio seguente:

var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, true);

In fase di esecuzione, il comportamento risponderà all'interazione con il controllo in base all'implementazione del comportamento. Gli screenshot seguenti illustrano il comportamento associato che risponde a input non valido:

Applicazione di esempio con comportamento associato

Nota

I comportamenti associati vengono scritti per un tipo di controllo specifico, o per una superclasse che è possibile applicare a molti controlli, e devono essere aggiunti solo a controlli compatibili. Il tentativo di associare un comportamento a un controllo incompatibile genererà un comportamento imprevisto dettato dall'implementazione del comportamento.

Rimozione di un comportamento associato da un controllo

La classe NumericValidationBehavior può essere rimossa da un controllo impostando la proprietà associata AttachBehavior su false, come illustrato nell'esempio di codice XAML seguente:

<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="false" />

Il codice C# equivalente per Entry è visualizzato nell'esempio seguente:

var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, false);

In fase di esecuzione, il metodo OnAttachBehaviorChanged sarà eseguito quando il valore della proprietà associata AttachBehavior è impostato su false. Il metodo OnAttachBehaviorChanged eseguirà quindi l'annullamento della registrazione del gestore eventi per l'evento TextChanged, affinché il comportamento non venga eseguito quando l'utente interagisce con il controllo.

Riepilogo

Questo articolo ha illustrato come creare e usare i comportamenti associati. I comportamenti associati sono classi static con una o più proprietà associate.