Generik
.NET Multi-platform App UI (.NET MAUI) XAML menyediakan dukungan untuk menggunakan jenis CLR generik dengan menentukan batasan generik sebagai argumen jenis. Dukungan ini disediakan oleh direktif x:TypeArguments
, yang meneruskan argumen jenis pembatas dari generik ke konstruktor tipe generik tersebut.
Argumen jenis ditentukan sebagai string, dan biasanya diawali, seperti sys:String
dan sys:Int32
. Awalan diperlukan karena tipe batasan generik CLR biasanya berasal dari pustaka yang tidak dipetakan langsung ke namespace .NET MAUI default. 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.
Penting
Menentukan jenis generik di .NET MAUI XAML, dengan direktif x:TypeArguments
, tidak didukung.
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.
Nota
Ekstensi markup x:Type
menyediakan referensi jenis Common Language Runtime (CLR) untuk jenis generik, dan memiliki fungsi yang mirip dengan operator typeof
di C#. Untuk informasi selengkapnya, lihat x:Type markup extension.
Untuk informasi tentang menentukan jenis generik di .NET MAUI XAML, dengan direktif x:DataType
dan x:Type
, lihat Mengkompilasi pengikatan yang menentukan jenis generik dan 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://schemas.microsoft.com/dotnet/2021/maui"
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 namespace scg
XAML. Properti CollectionView.ItemsSource
diatur ke List<T>
yang diinstansiasi dengan argumen tipe string
, menggunakan tipe bawaan XAML 2009 x:String
. Koleksi List<string>
diinisialisasi dengan sejumlah item string
.
Sebagai alternatif yang setara, koleksi List<T>
dapat diinisialisasi dengan tipe CLR String
.
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
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://schemas.microsoft.com/dotnet/2021/maui"
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 x:DataType="models:Monkey">
<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 namespace models
XAML, dan System.Collections.Generic
didefinisikan sebagai namespace scg
XAML. Properti CollectionView.ItemsSource
diatur ke List<T>
yang dibuat dengan argumen jenis Monkey
. Koleksi List<Monkey>
diinisialisasi dengan beberapa item Monkey
, dan DataTemplate yang menentukan tampilan setiap objek Monkey
ditetapkan 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://schemas.microsoft.com/dotnet/2021/maui"
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 x:DataType="scg:KeyValuePair(x:String,models:Monkey)">
<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 namespace models
XAML, dan System.Collections.Generic
didefinisikan sebagai namespace scg
XAML. Properti CollectionView.ItemsSource
diatur ke List<T>
yang dibuat dengan menggunakan kendala KeyValuePair<TKey, TValue>
, dengan argumen tipe kendala dalam string
dan Monkey
. Koleksi List<KeyValuePair<string,Monkey>>
diinisialisasi dengan beberapa item KeyValuePair
menggunakan konstruktor KeyValuePair
yang bukan default, dan DataTemplate yang menentukan tampilan setiap objek Monkey
diatur sebagai ItemTemplate
dari CollectionView. Untuk informasi tentang meneruskan argumen ke konstruktor non-default, lihat argumen konstruktor Pass.