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 TimePicker
TimeSpan
, 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:
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.