Freigeben über


Generika in Xamarin.Forms XAML

Xamarin.Forms XAML bietet Unterstützung für die Verwendung generischer CLR-Typen, indem die generischen Einschränkungen als Typargumente angegeben werden. Diese Unterstützung wird über die Anweisung x:TypeArguments bereitgestellt, die die einschränkenden Typargumente eines generischen Typs an den Konstruktor des generischen Typs übergibt.

Wichtig

Das Definieren generischer Klassen in Xamarin.Forms XAML mit der x:TypeArguments Direktive wird nicht unterstützt.

Typargumente werden als Zeichenfolge angegeben und in der Regel mit einem Präfix versehen, z. B. sys:String und sys:Int32. Präfixierung ist erforderlich, da die typischen Typen generischer CLR-Einschränkungen aus Bibliotheken stammen, die nicht dem Standardnamespace Xamarin.Forms zugeordnet sind. Die in XAML 2009 integrierten Typen wie x:String und x:Int32 können jedoch auch als Typargumente angegeben werden, wobei x der XAML-Sprachnamespace für XAML 2009 ist. Weitere Informationen über die in XAML 2009 integrierten Typen finden Sie unter XAML 2009-Sprachprimitive.

Mehrere Typargumente können mit einem Trennzeichen (Komma) angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, sollten die geschachtelten Argumente für den Einschränkungstyp außerdem in Klammern gesetzt werden.

Hinweis

Die x:Type Markuperweiterung stellt einen CLR-Typverweis für einen generischen Typ bereit und hat eine ähnliche Funktion wie der typeof Operator in C#. Weitere Informationen finden Sie unter x:Type-Markuperweiterung.

Einzelnes Grundtypargument

Ein einzelnes Grundtypargument kann mit der Anweisung x:TypeArguments als Zeichenfolgenargument mit einem Präfix angegeben werden:

<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>

In diesem Beispiel ist System.Collections.Generic als der XAML-Namespace scg definiert. Die Eigenschaft CollectionView.ItemsSource wird auf List<T> festgelegt und mit einem string-Typargument instanziiert, wobei der in XAML 2009 integrierte Typ x:String verwendet wird. Die Sammlung List<string> wird mit mehreren string-Elementen initialisiert.

Die Sammlung List<T> kann alternativ, aber gleichwertig, mit dem CLR-Typ String instanziiert werden:

<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>

Einzelnes Objekttypargument

Ein einzelnes Objekttypargument kann mit der Anweisung x:TypeArguments als Zeichenfolgenargument mit Präfix angegeben werden:

<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>

In diesem Beispiel ist GenericsDemo.Models als der XAML-Namespace models und System.Collections.Generic als der XAML-Namespace scg definiert. Die Eigenschaft CollectionView.ItemsSource wird auf List<T> festgelegt und mit einem Monkey-Typargument instanziiert. Die Sammlung List<Monkey> wird mit mehreren Monkey-Objekten initialisiert, und eine DataTemplate, die das Aussehen jedes Monkey-Objekts definiert, wird als ItemTemplate von CollectionView festgelegt.

Mehrere Typargumente

Mehrere Typargumente können als vorangestellte Zeichenfolgenargumente, die durch ein Komma getrennt sind, mit der Anweisung x:TypeArguments angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, werden die geschachtelten Argumente für den Einschränkungstyp in Klammern gesetzt:

<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    

In diesem Beispiel ist GenericsDemo.Models als der XAML-Namespace models und System.Collections.Generic als der XAML-Namespace scg definiert. Die Eigenschaft CollectionView.ItemsSource wird auf List<T> gesetzt und mit einer Einschränkung KeyValuePair<TKey, TValue> mit den inneren Argumenten des Einschränkungstyps string und Monkey instanziiert. Die Sammlung List<KeyValuePair<string,Monkey>> wird mit mehreren KeyValuePair-Elementen initialisiert, wobei der nicht standardmäßige KeyValuePair-Konstruktor verwendet wird, und eine DataTemplate, die das Aussehen jedes Monkey-Objekts definiert, wird als ItemTemplate von CollectionView festgelegt. Informationen zum Übergeben von Argumenten an einen nicht standardmäßigen Konstruktor finden Sie unter Übergeben von Konstruktorargumenten.