Condividi tramite


Estensioni BindableObject

Le BindableObject estensioni forniscono una serie di metodi di estensione che supportano la Bindingconfigurazione di in un oggetto BindableObject.

Le estensioni offrono i metodi seguenti:

Binding

Il Bind metodo offre una serie di overload che offrono praticità diverse per la configurazione di un oggetto Binding. Per altre informazioni sulle possibilità di Binding dati in un'applicazione MAUI .NET, vedere la documentazione Microsoft.

Esempio

Esistono diversi overload per il Bind metodo .

Binding unidirezionale

È possibile creare un binding unidirezionale da una proprietà del modello di visualizzazione (RegistrationViewModel) chiamata RegistrationCode alla Text proprietà di un oggetto Label come indicato di seguito:

new Entry()
    .Bind(Label.TextProperty, 
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode)

Associazione bidirezionale

È possibile creare un'associazione bidirezionale da una proprietà del modello di visualizzazione (RegistrationViewModel) chiamata RegistrationCode alla Text proprietà di un oggetto Entry come indicato di seguito:

new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            setter: static (RegistrationViewModel vm, string code) => vm.RegistrationCode = code)

Binding complessi (annidati)

Quando si esegue l'associazione a una proprietà all'interno di una proprietà (nota anche come "Binding annidati"), il handlers parametro è obbligatorio. Il handler parametro richiede un riferimento a ogni proprietà nella catena di associazione complessa.

Insieme all'esempio seguente, è possibile trovare esempi aggiuntivi di associazioni complesse negli unit test per CommunityToolkit.Maui.Markup.

Esempio di associazioni complesse (annidate)

Usando la classe seguente ViewModel , è possibile creare un'associazione bidirezionale annidata direttamente all'uso ViewModel.NestedObject.Text del handlers parametro :

new Entry().Bind(
    Entry.TextProperty,
    getter: static (ViewModel vm) => vm.NestedObject.Text,
    handlers: new (Func<ViewModel, object?>, string)[]
             {
                (vm => vm, nameof(ViewModel.NestedObject)),
                (vm => vm.NestedObject, nameof(ViewModel.NestedObject.Text)),
             },
    setter: static (ViewModel vm, string text) => vm.NestedObject.Text = text);
class ViewModel
{
    public NestedObject NestedObject { get; set; } = new();

    public required string Text { get; set; }
}

class NestedObject
{
    public required string Text { get; set; }
}

Proprietà predefinita

Il Bind metodo può essere chiamato senza specificare la proprietà per cui impostare l'associazione, verranno utilizzate le impostazioni predefinite fornite dalla libreria con l'elenco completo nel repository GitHub.

La proprietà predefinita da associare per un Entry oggetto è la proprietà di testo. L'esempio precedente può quindi essere scritto come:

new Entry().Bind(nameof(ViewModel.RegistrationCode))

Avviso

Questo approccio comporterà l'uso di un certo livello di reflection e non eseguirà così come l'approccio alla proprietà Explicit.

Conversione di valori

Il Bind metodo consente a uno sviluppatore di fornire l'oggetto Converter che desidera utilizzare nell'associazione o semplicemente fornire un meccanismo per l'uso di una conversione inline.

Convertitore
new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            converter: new TextCaseConverter { Type = TextCaseType.Upper });

Vedere TextCaseConverter la documentazione relativa all'utilizzo completo.

Conversione inline
new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            convert: (string? text) => text?.ToUpperInvariant());

Associazioni multiple

È possibile aggregare più associazioni usando .IMultiValueConverter

Il convert parametro è un oggetto Func necessario per convertire le associazioni multiple nel risultato richiesto.

new Label()
    .Bind(Label.TextProperty,
            binding1: new Binding(nameof(ViewModel.IsBusy)),
            binding2: new Binding(nameof(ViewModel.LabelText)),
            convert: ((bool IsBusy, string LabelText) values) => values.IsBusy ? string.Empty : values.LabelText)

BindCommand

Il BindCommand metodo fornisce un modo utile per configurare un'associazione a un'impostazione predefinita fornita dalla libreria con l'elenco completo nel repository GitHub.

Il comando predefinito da associare per un Button oggetto è la Command proprietà . Nell'esempio seguente viene quindi impostata un'associazione a tale proprietà.

new Button().BindCommand(static (ViewModel vm) => vm.SubmitCommand);

Il codice precedente può anche essere scritto come segue:

Nota

Se il comando predefinito non comporta l'associazione al comando desiderato, è possibile usare il Bind metodo .

new Button()
    .Bind(Entry.CommandProperty,
            getter: static (RegistrationViewModel vm) => vm.SubmitCommand,
            mode: BindingMode.OneTime);

Associazione di movimenti

Le associazioni di movimento consentono di creare un ClickGestureRecognizeroggetto , SwipeGestureRecognizer, TapGestureRecognizerassociarlo a qualsiasi elemento che implementa IGestureRecognizer e associarlo a un ICommand oggetto in ViewModel.

BindClickGesture

Nell'esempio seguente viene illustrato come creare un oggetto ClickGestureRecognizer che richiede 2 clic per attivarlo, collegarlo a un Label oggetto e associarlo a una ICommand proprietà denominata ClickCommand in ViewModel:

new Label()
    .BindClickGesture(
        static (ViewModel vm) => vm.ClickCommand,
        commandBindingMode: BindingMode.OneTime,
        numberOfClicksRequired: 2));

BindSwipeGesture

Nell'esempio seguente viene illustrato come creare un oggetto SwipeGestureRecognizer che richiede SwipeDirection.Up una SwipeDirection distanza di minumum di 200 punti per Threshold, quindi associarla a ICommand una Label proprietà denominata SwipeCommand in ViewModel:

new Label()
    .BindSwipeGesture(
        static (ViewModel vm) => vm.SwipeCommand,
        commandBindingMode: BindingMode.OneTime,
        direction: SwipeDirection.Up,
        threshold: 200);

BindTapGesture

Nell'esempio seguente viene illustrato come creare un oggetto ClickGestureRecognizer che richiede 2 l'attivazione, associarlo a un Label oggetto e associarlo a una ICommand proprietà denominata TapCommand in ViewModel:

new Label()
    .BindTapGesture(
        static (ViewModel vm) => vm.TapCommand,
        commandBindingMode: BindingMode.OneTime,
        numberOfTapsRequired: 2));

AppThemeBinding

Il AppThemeBinding metodo consente di assegnare un valore chiaro e scuro a un oggetto BindableProperty in modo che, quando le applicazioni AppTheme vengono modificate, verrà usato il valore appropriato per tale tema.

Nell'esempio seguente il colore nero verrà assegnato alla Text proprietà del Label controllo se l'applicazione è in esecuzione in tema chiaro e bianco in tema scuro.

new Label().AppThemeBinding(Label.TextColorProperty, Colors.Black, Colors.White);

Nota

Esiste un metodo più specifico quando si gestiscono Color le proprietà. AppThemeColorBinding eseguirà lo stesso comportamento sottostante, AppThemeBinding ma richiede un set di Color parametri.

Per altre informazioni, vedere la documentazione relativa agli argomenti .

Esempi

È possibile trovare un esempio di questi metodi di estensione in azione in tutta l'applicazione di esempio .NET MAUI Community Toolkit.

API

È possibile trovare il codice sorgente per i BindableObject metodi di estensione nel repository GitHub .NET MAUI Community Toolkit.