Membuat Xamarin.Forms DataTemplate
Templat data dapat dibuat sebaris, di ResourceDictionary, atau dari jenis kustom atau jenis sel yang sesuai Xamarin.Forms . Artikel ini mengeksplorasi setiap teknik.
Skenario penggunaan umum untuk adalah DataTemplate
menampilkan data dari kumpulan objek dalam ListView
. Tampilan data untuk setiap sel dalam ListView
dapat dikelola dengan mengatur ListView.ItemTemplate
properti ke DataTemplate
. Ada sejumlah teknik yang dapat digunakan untuk mencapai hal ini:
- Membuat Data SebarisTemplate.
- Membuat DataTemplate dengan Jenis.
- Membuat DataTemplate sebagai Sumber Daya.
Terlepas dari teknik yang digunakan, hasilnya adalah bahwa tampilan setiap sel di ListView
didefinisikan oleh DataTemplate
, seperti yang ditunjukkan pada cuplikan layar berikut:
Membuat DataTemplate Sebaris
Properti ListView.ItemTemplate
dapat diatur ke sebaris DataTemplate
. Templat sebaris, yang merupakan templat yang ditempatkan sebagai anak langsung dari properti kontrol yang sesuai, harus digunakan jika tidak perlu menggunakan kembali templat data di tempat lain. Elemen yang ditentukan dalam DataTemplate
menentukan tampilan setiap sel, seperti yang ditunjukkan dalam contoh kode XAML berikut:
<ListView Margin="0,20,0,0">
<ListView.ItemsSource>
<x:Array Type="{x:Type local:Person}">
<local:Person Name="Steve" Age="21" Location="USA" />
<local:Person Name="John" Age="37" Location="USA" />
<local:Person Name="Tom" Age="42" Location="UK" />
<local:Person Name="Lucas" Age="29" Location="Germany" />
<local:Person Name="Tariq" Age="39" Location="UK" />
<local:Person Name="Jane" Age="30" Location="USA" />
</x:Array>
</ListView.ItemsSource>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
...
<Label Text="{Binding Name}" FontAttributes="Bold" />
<Label Grid.Column="1" Text="{Binding Age}" />
<Label Grid.Column="2" Text="{Binding Location}" HorizontalTextAlignment="End" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Anak dari sebaris DataTemplate
harus dari, atau berasal dari, jenis Cell
. Contoh ini menggunakan ViewCell
, yang berasal dari Cell
. Tata letak di ViewCell
dalam dikelola di sini oleh Grid
. Grid
berisi tiga Label
instans yang mengikat propertinya Text
ke properti yang sesuai dari setiap Person
objek dalam koleksi.
Kode C# yang setara ditampilkan dalam contoh kode berikut:
public class WithDataTemplatePageCS : ContentPage
{
public WithDataTemplatePageCS()
{
...
var people = new List<Person>
{
new Person { Name = "Steve", Age = 21, Location = "USA" },
...
};
var personDataTemplate = new DataTemplate(() =>
{
var grid = new Grid();
...
var nameLabel = new Label { FontAttributes = FontAttributes.Bold };
var ageLabel = new Label();
var locationLabel = new Label { HorizontalTextAlignment = TextAlignment.End };
nameLabel.SetBinding(Label.TextProperty, "Name");
ageLabel.SetBinding(Label.TextProperty, "Age");
locationLabel.SetBinding(Label.TextProperty, "Location");
grid.Children.Add(nameLabel);
grid.Children.Add(ageLabel, 1, 0);
grid.Children.Add(locationLabel, 2, 0);
return new ViewCell { View = grid };
});
Content = new StackLayout
{
Margin = new Thickness(20),
Children = {
...
new ListView { ItemsSource = people, ItemTemplate = personDataTemplate, Margin = new Thickness(0, 20, 0, 0) }
}
};
}
}
Di C#, sebaris DataTemplate
dibuat menggunakan kelebihan beban konstruktor yang menentukan Func
argumen.
Membuat DataTemplate dengan Jenis
Properti ListView.ItemTemplate
juga dapat diatur ke yang DataTemplate
dibuat dari jenis sel. Keuntungan dari pendekatan ini adalah bahwa tampilan yang ditentukan oleh jenis sel dapat digunakan kembali oleh beberapa templat data di seluruh aplikasi. Kode XAML berikut menunjukkan contoh pendekatan ini:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DataTemplates"
...>
<StackLayout Margin="20">
...
<ListView Margin="0,20,0,0">
<ListView.ItemsSource>
<x:Array Type="{x:Type local:Person}">
<local:Person Name="Steve" Age="21" Location="USA" />
...
</x:Array>
</ListView.ItemsSource>
<ListView.ItemTemplate>
<DataTemplate>
<local:PersonCell />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Di sini, ListView.ItemTemplate
properti diatur ke DataTemplate
yang dibuat dari jenis kustom yang menentukan tampilan sel. Jenis kustom harus berasal dari jenis ViewCell
, seperti yang ditunjukkan dalam contoh kode berikut:
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DataTemplates.PersonCell">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.2*" />
<ColumnDefinition Width="0.3*" />
</Grid.ColumnDefinitions>
<Label Text="{Binding Name}" FontAttributes="Bold" />
<Label Grid.Column="1" Text="{Binding Age}" />
<Label Grid.Column="2" Text="{Binding Location}" HorizontalTextAlignment="End" />
</Grid>
</ViewCell>
ViewCell
Dalam tata letak , dikelola di sini oleh Grid
. Grid
berisi tiga Label
instans yang mengikat propertinya Text
ke properti yang sesuai dari setiap Person
objek dalam koleksi.
Kode C# yang setara ditampilkan dalam contoh berikut:
public class WithDataTemplatePageFromTypeCS : ContentPage
{
public WithDataTemplatePageFromTypeCS()
{
...
var people = new List<Person>
{
new Person { Name = "Steve", Age = 21, Location = "USA" },
...
};
Content = new StackLayout
{
Margin = new Thickness(20),
Children = {
...
new ListView { ItemTemplate = new DataTemplate(typeof(PersonCellCS)), ItemsSource = people, Margin = new Thickness(0, 20, 0, 0) }
}
};
}
}
Di C#, DataTemplate
dibuat menggunakan kelebihan beban konstruktor yang menentukan jenis sel sebagai argumen. Jenis sel harus berasal dari tipe ViewCell
, seperti yang diperlihatkan dalam contoh kode berikut:
public class PersonCellCS : ViewCell
{
public PersonCellCS()
{
var grid = new Grid();
...
var nameLabel = new Label { FontAttributes = FontAttributes.Bold };
var ageLabel = new Label();
var locationLabel = new Label { HorizontalTextAlignment = TextAlignment.End };
nameLabel.SetBinding(Label.TextProperty, "Name");
ageLabel.SetBinding(Label.TextProperty, "Age");
locationLabel.SetBinding(Label.TextProperty, "Location");
grid.Children.Add(nameLabel);
grid.Children.Add(ageLabel, 1, 0);
grid.Children.Add(locationLabel, 2, 0);
View = grid;
}
}
Catatan
Perhatikan bahwa Xamarin.Forms juga menyertakan jenis sel yang dapat digunakan untuk menampilkan data sederhana dalam ListView
sel. Untuk informasi selengkapnya, lihat Tampilan Sel.
Membuat DataTemplate sebagai Sumber Daya
Templat data juga dapat dibuat sebagai objek yang dapat digunakan kembali dalam ResourceDictionary
. Ini dicapai dengan memberikan setiap deklarasi atribut unik x:Key
, yang menyediakannya dengan kunci deskriptif di ResourceDictionary
, seperti yang ditunjukkan dalam contoh kode XAML berikut:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
...>
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="personTemplate">
<ViewCell>
<Grid>
...
</Grid>
</ViewCell>
</DataTemplate>
</ResourceDictionary>
</ContentPage.Resources>
<StackLayout Margin="20">
...
<ListView ItemTemplate="{StaticResource personTemplate}" Margin="0,20,0,0">
<ListView.ItemsSource>
<x:Array Type="{x:Type local:Person}">
<local:Person Name="Steve" Age="21" Location="USA" />
...
</x:Array>
</ListView.ItemsSource>
</ListView>
</StackLayout>
</ContentPage>
DataTemplate
ditetapkan ke ListView.ItemTemplate
properti dengan menggunakan StaticResource
ekstensi markup. Perhatikan bahwa saat DataTemplate
ditentukan dalam halaman ResourceDictionary
, itu juga dapat ditentukan pada tingkat kontrol atau tingkat aplikasi.
Contoh kode berikut menunjukkan halaman yang setara di C#:
public class WithDataTemplatePageCS : ContentPage
{
public WithDataTemplatePageCS ()
{
...
var personDataTemplate = new DataTemplate (() => {
var grid = new Grid ();
...
return new ViewCell { View = grid };
});
Resources = new ResourceDictionary ();
Resources.Add ("personTemplate", personDataTemplate);
Content = new StackLayout {
Margin = new Thickness(20),
Children = {
...
new ListView { ItemTemplate = (DataTemplate)Resources ["personTemplate"], ItemsSource = people };
}
};
}
}
DataTemplate
ditambahkan ke ResourceDictionary
menggunakan Add
metode , yang menentukan Key
string yang digunakan untuk mereferensikan DataTemplate
saat mengambilnya.
Ringkasan
Artikel ini telah menjelaskan cara membuat templat data, sebaris, dari jenis kustom, atau di ResourceDictionary
. Templat sebaris harus digunakan jika tidak perlu menggunakan kembali templat data di tempat lain. Atau, templat data dapat digunakan kembali dengan menentukannya sebagai jenis kustom, atau sebagai sumber daya tingkat kontrol, tingkat halaman, atau tingkat aplikasi.