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:
- Il delegato
propertyChanged
esegue il cast del riferimento del controllo, ricevuto comeBindableObject
, convertendolo nel tipo di controllo che il comportamento è progettato per migliorare. - 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:
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.