Bagikan melalui


Xamarin.Forms Jalur Pengikatan

Dalam semua contoh pengikatan data sebelumnya, Path properti Binding kelas (atau Path properti Binding ekstensi markup) telah diatur ke satu properti. Sebenarnya dimungkinkan untuk mengatur Path ke sub-properti (properti properti), atau ke anggota koleksi.

Misalnya, halaman Anda berisi TimePicker:

<TimePicker x:Name="timePicker">

Properti Time berjenis TimePickerTimeSpan, tetapi mungkin Anda ingin membuat pengikatan data yang mereferensikan properti dari TimeSpan nilai tersebutTotalSeconds. Berikut adalah pengikatan data:

{Binding Source={x:Reference timePicker},
         Path=Time.TotalSeconds}

Properti Time berjenis TimeSpan, yang memiliki TotalSeconds properti . Properti Time dan TotalSeconds hanya terhubung dengan titik. Item dalam Path string selalu merujuk ke properti dan bukan ke jenis properti ini.

Contoh tersebut dan beberapa lainnya ditampilkan di halaman Variasi Jalur:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:globe="clr-namespace:System.Globalization;assembly=netstandard"
             x:Class="DataBindingDemos.PathVariationsPage"
             Title="Path Variations"
             x:Name="page">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Label">
                <Setter Property="FontSize" Value="Large" />
                <Setter Property="HorizontalTextAlignment" Value="Center" />
                <Setter Property="VerticalOptions" Value="CenterAndExpand" />
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout Margin="10, 0">
        <TimePicker x:Name="timePicker" />

        <Label Text="{Binding Source={x:Reference timePicker},
                              Path=Time.TotalSeconds,
                              StringFormat='{0} total seconds'}" />

        <Label Text="{Binding Source={x:Reference page},
                              Path=Content.Children.Count,
                              StringFormat='There are {0} children in this StackLayout'}" />

        <Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
                              Path=DateTimeFormat.DayNames[3],
                              StringFormat='The middle day of the week is {0}'}" />

        <Label>
            <Label.Text>
                <Binding Path="DateTimeFormat.DayNames[3]"
                         StringFormat="The middle day of the week in France is {0}">
                    <Binding.Source>
                        <globe:CultureInfo>
                            <x:Arguments>
                                <x:String>fr-FR</x:String>
                            </x:Arguments>
                        </globe:CultureInfo>
                    </Binding.Source>
                </Binding>
            </Label.Text>
        </Label>

        <Label Text="{Binding Source={x:Reference page},
                              Path=Content.Children[1].Text.Length,
                              StringFormat='The second Label has {0} characters'}" />
    </StackLayout>
</ContentPage>

Di yang kedua Label, sumber pengikatan adalah halaman itu sendiri. Properti Content berjenis StackLayout, yang memiliki Children properti jenis IList<View>, yang memiliki properti yang Count menunjukkan jumlah anak.

Jalur dengan Pengindeks

Pengikatan di yang ketiga Label di halaman Variasi Jalur mereferensikan CultureInfo kelas di System.Globalization namespace:

<Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
                      Path=DateTimeFormat.DayNames[3],
                      StringFormat='The middle day of the week is {0}'}" />

Sumber diatur ke properti statis CultureInfo.CurrentCulture , yang merupakan objek jenis CultureInfo. Kelas tersebut mendefinisikan properti bernama DateTimeFormat jenis DateTimeFormatInfo yang berisi DayNames koleksi. Indeks memilih item keempat.

Label Keempat melakukan sesuatu yang serupa tetapi untuk budaya yang terkait dengan Prancis. Properti Source pengikatan diatur ke CultureInfo objek dengan konstruktor:

<Label>
    <Label.Text>
        <Binding Path="DateTimeFormat.DayNames[3]"
                 StringFormat="The middle day of the week in France is {0}">
            <Binding.Source>
                <globe:CultureInfo>
                    <x:Arguments>
                        <x:String>fr-FR</x:String>
                    </x:Arguments>
                </globe:CultureInfo>
            </Binding.Source>
        </Binding>
    </Label.Text>
</Label>

Lihat Meneruskan Argumen Konstruktor untuk detail selengkapnya tentang menentukan argumen konstruktor di XAML.

Akhirnya, contoh terakhir mirip dengan yang kedua, kecuali bahwa itu mereferensikan salah satu anak dari StackLayout:

<Label Text="{Binding Source={x:Reference page},
                      Path=Content.Children[1].Text.Length,
                      StringFormat='The first Label has {0} characters'}" />

Anak itu adalah Label, yang memiliki Text properti jenis String, yang memiliki Length properti . Yang pertama Label melaporkan TimeSpan set di TimePicker, jadi ketika teks tersebut berubah, perubahan akhir Label juga.

Berikut adalah program yang berjalan:

Variasi Jalur

Men-debug Jalur Kompleks

Definisi jalur kompleks bisa sulit dibuat: Anda perlu mengetahui jenis setiap sub-properti atau jenis item dalam koleksi untuk menambahkan sub-properti berikutnya dengan benar, tetapi jenisnya sendiri tidak muncul di jalur. Salah satu teknik yang baik adalah membangun jalur secara bertahap dan melihat hasil perantara. Untuk contoh terakhir itu, Anda dapat memulai tanpa Path definisi sedikitpun:

<Label Text="{Binding Source={x:Reference page},
                      StringFormat='{0}'}" />

Yang menampilkan jenis sumber pengikatan, atau DataBindingDemos.PathVariationsPage. Anda tahu PathVariationsPage berasal dari ContentPage, sehingga memiliki Content properti:

<Label Text="{Binding Source={x:Reference page},
                      Path=Content,
                      StringFormat='{0}'}" />

Jenis Content properti sekarang terungkap menjadi Xamarin.Forms.StackLayout. Children Tambahkan properti ke Path dan jenisnya adalah Xamarin.Forms.ElementCollection'1[Xamarin.Forms.View], yang merupakan internal kelas ke Xamarin.Forms, tetapi jelas merupakan jenis koleksi. Tambahkan indeks ke dalamnya dan jenisnya adalah Xamarin.Forms.Label. Lanjutkan dengan cara ini.

Saat Xamarin.Forms memproses jalur pengikatan, ia menginstal PropertyChanged handler pada objek apa pun di jalur yang mengimplementasikan INotifyPropertyChanged antarmuka. Misalnya, pengikatan akhir bereaksi terhadap perubahan pertama Label karena Text properti berubah.

Jika properti di jalur pengikatan tidak menerapkan INotifyPropertyChanged, setiap perubahan pada properti tersebut akan diabaikan. Beberapa perubahan dapat sepenuhnya membatalkan jalur pengikatan, jadi Anda harus menggunakan teknik ini hanya ketika string properti dan sub-properti tidak pernah menjadi tidak valid.