Estensioni BindableObject
Le BindableObject
estensioni forniscono una serie di metodi di estensione che supportano la Binding
configurazione 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 ClickGestureRecognizer
oggetto , SwipeGestureRecognizer
, TapGestureRecognizer
associarlo 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.
.NET MAUI Community Toolkit
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per