Xamarin.Forms Pengikatan Relatif
Pengikatan relatif memberikan kemampuan untuk mengatur sumber pengikatan relatif terhadap posisi target pengikatan. Mereka dibuat dengan RelativeSource
ekstensi markup, dan ditetapkan sebagai Source
properti ekspresi pengikatan.
Ekstensi RelativeSource
markup didukung oleh RelativeSourceExtension
kelas , yang menentukan properti berikut:
Mode
, dari jenisRelativeBindingSourceMode
, menjelaskan lokasi sumber pengikatan relatif terhadap posisi target pengikatan.AncestorLevel
, dari jenisint
, tingkat leluhur opsional untuk dicari, ketikaMode
properti adalahFindAncestor
. DariAncestorLevel
n
instans yang dilewatiAncestorType
n-1
dari .AncestorType
, dari jenisType
, jenis leluhur untuk dicari, ketikaMode
properti adalahFindAncestor
.
Catatan
Parser XAML memungkinkan RelativeSourceExtension
kelas disingkat sebagai RelativeSource
.
Properti Mode
harus diatur ke salah RelativeBindingSourceMode
satu anggota enumerasi:
TemplatedParent
menunjukkan elemen tempat templat, di mana elemen terikat ada, diterapkan. Untuk informasi selengkapnya, lihat Mengikat ke induk templat.Self
menunjukkan elemen tempat pengikatan diatur, memungkinkan Anda untuk mengikat satu properti elemen tersebut ke properti lain pada elemen yang sama. Untuk informasi selengkapnya, lihat Mengikat ke diri sendiri.FindAncestor
menunjukkan leluhur di pohon visual elemen terikat. Mode ini harus digunakan untuk mengikat kontrol leluhur yang diwakili olehAncestorType
properti . Untuk informasi selengkapnya, lihat Mengikat ke leluhur.FindAncestorBindingContext
BindingContext
menunjukkan leluhur di pohon visual elemen terikat. Mode ini harus digunakan untuk mengikat keBindingContext
leluhur yang diwakili olehAncestorType
properti . Untuk informasi selengkapnya, lihat Mengikat ke leluhur.
Properti Mode
adalah properti konten kelas RelativeSourceExtension
. Oleh karena itu, untuk ekspresi markup XAML yang dinyatakan dengan kurung kurawal, Anda dapat menghilangkan Mode=
bagian ekspresi.
Untuk informasi selengkapnya tentang Xamarin.Forms ekstensi markup, lihat Ekstensi Markup XAML.
Ikat ke diri sendiri
Self
Mode pengikatan relatif digunakan mengikat properti elemen ke properti lain pada elemen yang sama:
<BoxView Color="Red"
WidthRequest="200"
HeightRequest="{Binding Source={RelativeSource Self}, Path=WidthRequest}"
HorizontalOptions="Center" />
Dalam contoh ini, BoxView
mengatur propertinya WidthRequest
ke ukuran tetap, dan HeightRequest
properti mengikat ke WidthRequest
properti . Oleh karena itu, kedua properti sama dan jadi persegi digambar:
Penting
Saat mengikat properti elemen ke properti lain pada elemen yang sama, properti harus berjenis yang sama. Atau, Anda dapat menentukan pengonversi pada pengikatan untuk mengonversi nilai.
Penggunaan umum mode pengikatan ini diatur objek BindingContext
ke properti itu sendiri. Kode berikut menunjukkan contoh ini:
<ContentPage ...
BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
<StackLayout>
<ListView ItemsSource="{Binding Employees}">
...
</ListView>
</StackLayout>
</ContentPage>
Dalam contoh ini, BindingContext
halaman diatur ke DefaultViewModel
properti itu sendiri. Properti ini didefinisikan dalam file code-behind untuk halaman, dan menyediakan instans viewmodel. Pengikatan ListView
ke Employees
properti viewmodel.
Mengikat ke leluhur
FindAncestor
Mode pengikatan relatif dan FindAncestorBindingContext
digunakan untuk mengikat ke elemen induk, dari jenis tertentu, di pohon visual. Mode FindAncestor
ini digunakan untuk mengikat ke elemen induk, yang berasal dari jenis .Element
Mode FindAncestorBindingContext
ini digunakan untuk mengikat ke BindingContext
elemen induk.
Peringatan
Properti AncestorType
harus diatur ke Type
saat menggunakan FindAncestor
mode pengikatan relatif dan FindAncestorBindingContext
, jika tidak, akan XamlParseException
dilemparkan.
Mode
Jika properti tidak diatur secara eksplisit, mengatur AncestorType
properti ke jenis yang berasal akan Element
secara implisit mengatur Mode
properti ke FindAncestor
. Demikian pula, mengatur AncestorType
properti ke jenis yang tidak berasal dari Element
akan secara implisit mengatur Mode
properti ke FindAncestorBindingContext
.
Catatan
Pengikatan relatif yang menggunakan FindAncestorBindingContext
mode akan diterapkan kembali ketika BindingContext
leluhur mana pun berubah.
XAML berikut menunjukkan contoh di mana Mode
properti akan secara implisit diatur ke FindAncestorBindingContext
:
<ContentPage ...
BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
<StackLayout>
<ListView ItemsSource="{Binding Employees}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Fullname}"
VerticalOptions="Center" />
<Button Text="Delete"
Command="{Binding Source={RelativeSource AncestorType={x:Type local:PeopleViewModel}}, Path=DeleteEmployeeCommand}"
CommandParameter="{Binding}"
HorizontalOptions="EndAndExpand" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Dalam contoh ini, BindingContext
halaman diatur ke DefaultViewModel
properti itu sendiri. Properti ini didefinisikan dalam file code-behind untuk halaman, dan menyediakan instans viewmodel. Pengikatan ListView
ke Employees
properti viewmodel. DataTemplate
, yang mendefinisikan tampilan setiap item di ListView
, berisi Button
. Properti tombol Command
terikat ke DeleteEmployeeCommand
dalam viewmodel induknya. Mengetuk menghapus Button
karyawan:
Selain itu, properti opsional AncestorLevel
dapat membantu memisahkan pencarian leluhur dalam skenario di mana mungkin ada lebih dari satu leluhur dari jenis itu di pohon visual:
<Label Text="{Binding Source={RelativeSource AncestorType={x:Type Entry}, AncestorLevel=2}, Path=Text}" />
Dalam contoh ini, Label.Text
properti mengikat ke Text
properti detik Entry
yang ditemui di jalur ke atas, dimulai dari elemen target pengikatan.
Catatan
Properti AncestorLevel
harus diatur ke 1 untuk menemukan nenek moyang terdekat dengan elemen target pengikatan.
Mengikat ke induk yang di-template
TemplatedParent
Mode pengikatan relatif digunakan untuk mengikat dari dalam templat kontrol ke instans objek runtime tempat templat diterapkan (dikenal sebagai induk templat). Mode ini hanya berlaku jika pengikatan relatif berada dalam templat kontrol, dan mirip dengan mengatur TemplateBinding
.
XAML berikut menunjukkan contoh TemplatedParent
mode pengikatan relatif:
<ContentPage ...>
<ContentPage.Resources>
<ControlTemplate x:Key="CardViewControlTemplate">
<Frame BindingContext="{Binding Source={RelativeSource TemplatedParent}}"
BackgroundColor="{Binding CardColor}"
BorderColor="{Binding BorderColor}"
...>
<Grid>
...
<Label Text="{Binding CardTitle}"
... />
<BoxView BackgroundColor="{Binding BorderColor}"
... />
<Label Text="{Binding CardDescription}"
... />
</Grid>
</Frame>
</ControlTemplate>
</ContentPage.Resources>
<StackLayout>
<controls:CardView BorderColor="DarkGray"
CardTitle="John Doe"
CardDescription="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla elit dolor, convallis non interdum."
IconBackgroundColor="SlateGray"
IconImageSource="user.png"
ControlTemplate="{StaticResource CardViewControlTemplate}" />
<controls:CardView BorderColor="DarkGray"
CardTitle="Jane Doe"
CardDescription="Phasellus eu convallis mi. In tempus augue eu dignissim fermentum. Morbi ut lacus vitae eros lacinia."
IconBackgroundColor="SlateGray"
IconImageSource="user.png"
ControlTemplate="{StaticResource CardViewControlTemplate}" />
<controls:CardView BorderColor="DarkGray"
CardTitle="Xamarin Monkey"
CardDescription="Aliquam sagittis, odio lacinia fermentum dictum, mi erat scelerisque erat, quis aliquet arcu."
IconBackgroundColor="SlateGray"
IconImageSource="user.png"
ControlTemplate="{StaticResource CardViewControlTemplate}" />
</StackLayout>
</ContentPage>
Dalam contoh ini, Frame
, yang merupakan elemen akar dari ControlTemplate
, telah BindingContext
diatur ke instans objek runtime tempat templat diterapkan. Oleh karena itu, Frame
dan anak-anaknya menyelesaikan ekspresi pengikatan mereka terhadap properti setiap CardView
objek:
Untuk informasi selengkapnya tentang templat kontrol, lihat Xamarin.Forms Templat Kontrol.