Generik dalam Xamarin.Forms XAML
Xamarin.Forms XAML menyediakan dukungan untuk mengkonsumsi jenis CLR generik dengan menentukan batasan generik sebagai argumen jenis. Dukungan ini disediakan oleh arahan x:TypeArguments
, yang meneruskan argumen jenis pembatasan generik ke konstruktor jenis generik.
Penting
Menentukan kelas generik di Xamarin.Forms XAML, dengan direktif x:TypeArguments
, tidak didukung.
Argumen jenis ditentukan sebagai string, dan biasanya diawali, seperti sys:String
dan sys:Int32
. Awalan diperlukan karena jenis umum batasan generik CLR berasal dari pustaka yang tidak dipetakan ke namespace default Xamarin.Forms . Namun, jenis bawaan XAML 2009 seperti x:String
dan x:Int32
, juga dapat ditentukan sebagai argumen jenis, di mana x
adalah namespace bahasa XAML untuk XAML 2009. Untuk informasi selengkapnya tentang jenis bawaan XAML 2009, lihat XAML 2009 Language Primitives.
Beberapa argumen jenis dapat ditentukan dengan menggunakan pemisah koma. Selain itu, jika batasan generik menggunakan jenis generik, argumen jenis batasan berlapis harus dimuat dalam tanda kurung.
Catatan
Ekstensi x:Type
markup menyediakan referensi jenis CLR untuk jenis generik, dan memiliki fungsi typeof
yang mirip dengan operator di C#. Untuk informasi selengkapnya, lihat ekstensi markup x:Type.
Argumen jenis primitif tunggal
Argumen jenis primitif tunggal dapat ditentukan sebagai argumen string awalan menggunakan direktif x:TypeArguments
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="x:String">
<x:String>Baboon</x:String>
<x:String>Capuchin Monkey</x:String>
<x:String>Blue Monkey</x:String>
<x:String>Squirrel Monkey</x:String>
<x:String>Golden Lion Tamarin</x:String>
<x:String>Howler Monkey</x:String>
<x:String>Japanese Macaque</x:String>
</scg:List>
</CollectionView.ItemsSource>
</CollectionView>
</ContentPage>
Dalam contoh ini, System.Collections.Generic
didefinisikan sebagai scg
namespace XAML. Properti CollectionView.ItemsSource
diatur ke yang List<T>
dibuat dengan string
argumen jenis, menggunakan jenis bawaan x:String
XAML 2009. Koleksi List<string>
diinisialisasi dengan beberapa string
item.
Atau, tetapi setara, List<T>
koleksi dapat diinisiasi dengan jenis CLR String
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
xmlns:sys="clr-namespace:System;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="sys:String">
<sys:String>Baboon</sys:String>
<sys:String>Capuchin Monkey</sys:String>
<sys:String>Blue Monkey</sys:String>
<sys:String>Squirrel Monkey</sys:String>
<sys:String>Golden Lion Tamarin</sys:String>
<sys:String>Howler Monkey</sys:String>
<sys:String>Japanese Macaque</sys:String>
</scg:List>
</CollectionView.ItemsSource>
</CollectionView>
</ContentPage>
Argumen jenis objek tunggal
Argumen jenis objek tunggal dapat ditentukan sebagai argumen string awalan menggunakan direktif x:TypeArguments
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:GenericsDemo.Models"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="models:Monkey">
<models:Monkey Name="Baboon"
Location="Africa and Asia"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg" />
<models:Monkey Name="Capuchin Monkey"
Location="Central and South America"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg" />
<models:Monkey Name="Blue Monkey"
Location="Central and East Africa"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg" />
</scg:List>
</CollectionView.ItemsSource>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.RowSpan="2"
Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60" />
<Label Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold" />
<Label Grid.Row="1"
Grid.Column="1"
Text="{Binding Location}"
FontAttributes="Italic"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage>
Dalam contoh ini, GenericsDemo.Models
didefinisikan sebagai models
namespace XAML, dan System.Collections.Generic
didefinisikan sebagai scg
namespace XAML. Properti CollectionView.ItemsSource
diatur ke yang List<T>
dibuat dengan Monkey
argumen jenis. Koleksi List<Monkey>
diinisialisasi dengan beberapa Monkey
item, dan DataTemplate
yang menentukan tampilan setiap Monkey
objek diatur sebagai ItemTemplate
dari CollectionView
.
Beberapa jenis argumen
Beberapa argumen jenis dapat ditentukan sebagai argumen string awalan, dibatasi oleh koma, menggunakan direktif x:TypeArguments
. Saat batasan generik menggunakan jenis generik, argumen jenis batasan berlapis terkandung dalam tanda kurung:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:GenericsDemo.Models"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="scg:KeyValuePair(x:String,models:Monkey)">
<scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
<x:Arguments>
<x:String>Baboon</x:String>
<models:Monkey Location="Africa and Asia"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg" />
</x:Arguments>
</scg:KeyValuePair>
<scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
<x:Arguments>
<x:String>Capuchin Monkey</x:String>
<models:Monkey Location="Central and South America"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg" />
</x:Arguments>
</scg:KeyValuePair>
<scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
<x:Arguments>
<x:String>Blue Monkey</x:String>
<models:Monkey Location="Central and East Africa"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg" />
</x:Arguments>
</scg:KeyValuePair>
</scg:List>
</CollectionView.ItemsSource>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.RowSpan="2"
Source="{Binding Value.ImageUrl}"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60" />
<Label Grid.Column="1"
Text="{Binding Key}"
FontAttributes="Bold" />
<Label Grid.Row="1"
Grid.Column="1"
Text="{Binding Value.Location}"
FontAttributes="Italic"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage
Dalam contoh ini, GenericsDemo.Models
didefinisikan sebagai models
namespace XAML, dan System.Collections.Generic
didefinisikan sebagai scg
namespace XAML. Properti CollectionView.ItemsSource
diatur ke List<T>
yang dibuat dengan KeyValuePair<TKey, TValue>
batasan, dengan argumen string
jenis batasan dalam dan Monkey
. Koleksi diinisialisasi List<KeyValuePair<string,Monkey>>
dengan beberapa KeyValuePair
item, menggunakan konstruktor non-default KeyValuePair
, dan DataTemplate
yang menentukan tampilan setiap Monkey
objek diatur sebagai ItemTemplate
dari CollectionView
. Untuk informasi tentang meneruskan argumen ke konstruktor non-default, lihat Meneruskan argumen konstruktor.