Bagikan melalui


Ekstensi BindableObject

BindableObject Ekstensi menyediakan serangkaian metode ekstensi yang mendukung konfigurasi Bindingpada BindableObject.

Ekstensi menawarkan metode berikut:

Mengikat

Metode ini Bind menawarkan sejumlah kelebihan beban yang memberikan kenyamanan yang berbeda di sekitar pengaturan Binding. Untuk informasi lebih lanjut tentang kemungkinan Binding data dalam aplikasi .NET MAUI, lihat dokumentasi Microsoft.

Contoh

Ada sejumlah kelebihan beban untuk metode ini Bind .

Pengikatan satu arah

Pengikatan satu arah dari properti model tampilan (RegistrationViewModel) yang Label dipanggil RegistrationCode ke Text properti dapat dibuat sebagai berikut:

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

Pengikatan dua arah

Pengikatan dua arah dari properti model tampilan (RegistrationViewModel) yang Entry dipanggil RegistrationCode ke Text properti dapat dibuat sebagai berikut:

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

Pengikatan Kompleks (Berlapis)

Saat mengikat properti di dalam properti (juga dikenal sebagai "Pengikatan Berlapis"), handlers parameter diperlukan. Parameter handler memerlukan referensi ke setiap Properti dalam rantai pengikatan yang kompleks.

Bersama dengan contoh di bawah ini, Anda dapat menemukan contoh tambahan pengikatan kompleks dalam Pengujian Unit untuk CommunityToolkit.Maui.Markup.

Contoh Pengikatan Kompleks (Berlapis)

Dengan menggunakan kelas di bawah iniViewModel, kita dapat membuat pengikatan dua arah berlapis secara langsung menggunakan handlers ViewModel.NestedObject.Text parameter :

new Entry().Bind(
    Entry.TextProperty,
    getter: static (ViewModel vm) => vm.NestedObject.Text,
    handlers: 
    [
        (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; }
}

Properti default

Metode Bind ini dapat dipanggil tanpa menentukan properti untuk mengatur pengikatan, ini akan menggunakan default yang disediakan oleh pustaka dengan daftar lengkap di repositori GitHub.

Properti default yang akan diikat adalah Entry properti teks. Jadi contoh di atas dapat ditulis sebagai:

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

Peringatan

Pendekatan ini akan mengakibatkan beberapa tingkat Pantulan digunakan dan tidak akan berkinerja serta pendekatan properti Eksplisit.

Peringatan

Pengikatan seperti ini yang menggunakan string untuk path: parameter tidak aman-pangkas

Konversi nilai

Metode ini Bind memungkinkan pengembang untuk menyediakan Converter yang ingin mereka gunakan dalam pengikatan atau hanya menyediakan mekanisme untuk menggunakan konversi sebaris.

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

Lihat TextCaseConverter untuk dokumentasi tentang penggunaan penuhnya.

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

Beberapa Pengikatan

Beberapa Pengikatan dapat dikumpulkan bersama-sama memanfaatkan IMultiValueConverter.

Parameter convert adalah Func yang diperlukan untuk mengonversi beberapa pengikatan ke hasil yang diperlukan.

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

BindCommand

Metode ini BindCommand menyediakan cara yang berguna untuk mengonfigurasi pengikatan ke default yang disediakan oleh pustaka dengan daftar lengkap di repositori GitHub.

Perintah default untuk mengikat adalah Button Command properti . Jadi contoh berikut menyiapkan pengikatan ke properti tersebut.

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

Hal di atas juga dapat ditulis sebagai:

Catatan

Jika perintah default tidak menghasilkan pengikatan ke perintah yang Anda inginkan, Maka Anda dapat menggunakan metode .Bind

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

Pengikatan Gerakan

Pengikatan gerakan memungkinkan kami membuat ClickGestureRecognizer, , SwipeGestureRecognizerTapGestureRecognizer, melampirkannya ke elemen apa pun yang mengimplementasikan IGestureRecognizer dan mengikatnya ke ICommand di ViewModel kami.

BindClickGesture

Contoh berikut menunjukkan cara membuat ClickGestureRecognizer yang memerlukan 2 klik untuk mengaktifkan, melampirkannya ke Label dan mengikatnya ke properti yang ICommand disebut ClickCommand di ViewModel kami:

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

BindSwipeGesture

Contoh berikut menunjukkan cara membuat SwipeGestureRecognizer yang memerlukan SwipeDirection.Up SwipeDirection dan jarak 200 titik minumum untuknya Threshold, lalu melampirkannya ke Label dan mengikatnya ke properti yang ICommand disebut SwipeCommand di ViewModel kami:

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

BindTapGesture

Contoh berikut menunjukkan cara membuat ClickGestureRecognizer yang mengharuskan 2 ketukan untuk mengaktifkan, melampirkannya ke Label dan mengikatnya ke properti yang ICommand disebut TapCommand di ViewModel kami:

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

AppThemeBinding

Metode ini AppThemeBinding memungkinkan nilai terang dan gelap ditetapkan ke BindableProperty sehingga ketika aplikasi AppTheme dimodifikasi, nilai yang sesuai akan digunakan untuk tema tersebut.

Contoh berikut akan menetapkan warna hitam ke Text properti Label kontrol jika aplikasi berjalan dalam tema terang dan putih dalam tema gelap.

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

Catatan

Ada metode yang lebih spesifik saat berhadapan dengan Color properti. AppThemeColorBinding akan melakukan perilaku yang mendasar yang sama seperti AppThemeBinding tetapi memerlukan sekumpulan Color parameter.

Untuk informasi selengkapnya, lihat dokumentasi Tema .

Contoh

Anda dapat menemukan contoh metode ekstensi ini yang beraksi di seluruh Aplikasi Sampel Toolkit Komunitas .NET MAUI.

API

Anda dapat menemukan kode sumber untuk BindableObject metode ekstensi di repositori GitHub .NET MAUI Community Toolkit.