Membuat Xamarin.Forms DataTemplateSelector
DataTemplateSelector dapat digunakan untuk memilih DataTemplate saat runtime berdasarkan nilai properti terikat data. Ini memungkinkan beberapa DataTemplates diterapkan ke jenis objek yang sama, untuk menyesuaikan tampilan objek tertentu. Artikel ini menunjukkan cara membuat dan menggunakan DataTemplateSelector.
Pemilih templat data memungkinkan skenario seperti ListView
pengikatan ke kumpulan objek, di mana tampilan setiap objek dalam ListView
dapat dipilih pada runtime oleh pemilih templat data yang mengembalikan pemilih templat data tertentu DataTemplate
.
Membuat DataTemplateSelector
Pemilih templat data diimplementasikan dengan membuat kelas yang mewarisi dari DataTemplateSelector
. Metode OnSelectTemplate
ini kemudian ditimpa untuk mengembalikan , seperti DataTemplate
yang ditunjukkan dalam contoh kode berikut:
public class PersonDataTemplateSelector : DataTemplateSelector
{
public DataTemplate ValidTemplate { get; set; }
public DataTemplate InvalidTemplate { get; set; }
protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
{
return ((Person)item).DateOfBirth.Year >= 1980 ? ValidTemplate : InvalidTemplate;
}
}
Metode OnSelectTemplate
mengembalikan templat yang sesuai berdasarkan nilai DateOfBirth
properti . Templat yang akan dikembalikan adalah nilai ValidTemplate
properti atau InvalidTemplate
properti , yang diatur saat mengkonsumsi PersonDataTemplateSelector
.
Instans kelas pemilih templat data kemudian dapat ditetapkan untuk Xamarin.Forms mengontrol properti seperti ListView.ItemTemplate
. Untuk daftar properti yang valid, lihat Membuat DataTemplate.
Batasan
DataTemplateSelector
instans memiliki batasan berikut:
- Subkelas
DataTemplateSelector
harus selalu mengembalikan templat yang sama untuk data yang sama jika dikueri beberapa kali. - Subkelas
DataTemplateSelector
tidak boleh mengembalikan subkelas lainDataTemplateSelector
. - Subkelas
DataTemplateSelector
tidak boleh mengembalikan instans baru dariDataTemplate
setiap panggilan. Sebagai gantinya, instans yang sama harus dikembalikan. Kegagalan untuk melakukannya akan membuat kebocoran memori dan akan menonaktifkan virtualisasi. - Di Android, tidak boleh ada lebih dari 20 templat data yang berbeda per
ListView
.
Mengkonsumsi DataTemplateSelector di XAML
Di XAML, PersonDataTemplateSelector
dapat dibuat dengan mendeklarasikannya sebagai sumber daya, seperti yang ditunjukkan dalam contoh kode berikut:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Selector;assembly=Selector" x:Class="Selector.HomePage">
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="validPersonTemplate">
<ViewCell>
...
</ViewCell>
</DataTemplate>
<DataTemplate x:Key="invalidPersonTemplate">
<ViewCell>
...
</ViewCell>
</DataTemplate>
<local:PersonDataTemplateSelector x:Key="personDataTemplateSelector"
ValidTemplate="{StaticResource validPersonTemplate}"
InvalidTemplate="{StaticResource invalidPersonTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
...
</ContentPage>
Tingkat ResourceDictionary
halaman ini mendefinisikan dua DataTemplate
instans dan instans PersonDataTemplateSelector
. Instans PersonDataTemplateSelector
mengatur properti dan InvalidTemplate
ke ValidTemplate
instans yang sesuai DataTemplate
dengan menggunakan StaticResource
ekstensi markup. Perhatikan bahwa sementara sumber daya didefinisikan dalam halaman ResourceDictionary
, sumber daya juga dapat ditentukan pada tingkat kontrol atau tingkat aplikasi.
Instans PersonDataTemplateSelector
dikonsumsi dengan menetapkannya ke ListView.ItemTemplate
properti , seperti yang ditunjukkan dalam contoh kode berikut:
<ListView x:Name="listView" ItemTemplate="{StaticResource personDataTemplateSelector}" />
Pada runtime, ListView
memanggil metode untuk setiap item dalam koleksi yang mendasarinya PersonDataTemplateSelector.OnSelectTemplate
, dengan panggilan meneruskan objek data sebagai item
parameter. yang dikembalikan oleh metode kemudian diterapkan ke objek tersebut DataTemplate
.
Cuplikan layar berikut menunjukkan hasil ListView
penerapan ke PersonDataTemplateSelector
setiap objek dalam koleksi yang mendasar:
Objek apa pun Person
yang memiliki DateOfBirth
nilai properti lebih besar dari atau sama dengan 1980 ditampilkan dalam warna hijau, dengan objek yang tersisa ditampilkan dalam warna merah.
Mengkonsumsi DataTemplateSelector di C#
Di C#, dapat dibuat dan ditetapkan ke ListView.ItemTemplate
properti , seperti yang PersonDataTemplateSelector
ditunjukkan dalam contoh kode berikut:
public class HomePageCS : ContentPage
{
DataTemplate validTemplate;
DataTemplate invalidTemplate;
public HomePageCS ()
{
...
SetupDataTemplates ();
var listView = new ListView {
ItemsSource = people,
ItemTemplate = new PersonDataTemplateSelector {
ValidTemplate = validTemplate,
InvalidTemplate = invalidTemplate }
};
Content = new StackLayout {
Margin = new Thickness (20),
Children = {
...
listView
}
};
}
...
}
Instans PersonDataTemplateSelector
ValidTemplate
mengatur properti dan InvalidTemplate
ke instans yang sesuai yang DataTemplate
dibuat oleh SetupDataTemplates
metode . Pada runtime, ListView
memanggil metode untuk setiap item dalam koleksi yang mendasarinya PersonDataTemplateSelector.OnSelectTemplate
, dengan panggilan meneruskan objek data sebagai item
parameter. yang dikembalikan oleh metode kemudian diterapkan ke objek tersebut DataTemplate
.
Ringkasan
Artikel ini telah menunjukkan cara membuat dan menggunakan DataTemplateSelector
. DataTemplateSelector
Dapat digunakan untuk memilih DataTemplate
pada runtime berdasarkan nilai properti terikat data. Ini memungkinkan beberapa DataTemplate
instans diterapkan ke jenis objek yang sama, untuk menyesuaikan tampilan objek tertentu.