Bagikan melalui


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.