Auf Englisch lesen

Freigeben über


Generics

.NET Multi-platform App UI (.NET MAUI) XAML bietet Unterstützung für die Verwendung generischer CLR-Typen, indem die generischen Einschränkungen als Typargumente angegeben werden. Diese Unterstützung wird von der x:TypeArguments-Direktive bereitgestellt, die die einschränkenden Typargumente eines generischen Typs an den Konstruktor des generischen Typs übergibt.

Typargumente werden als Zeichenfolge angegeben und werden in der Regel präfixiert, wie etwa sys:String und sys:Int32. Präfixierung ist erforderlich, da die typischen Typen generischer CLR-Einschränkungen aus Bibliotheken stammen, die nicht den standardmäßigen .NET MAUI-Namespaces zugeordnet sind. Die integrierten XAML 2009-Typen, wie etwa x:String und x:Int32, können jedoch auch als Typargumente angegeben werden. Dabei handelt es sich bei x um den XAML-Sprach-Namespace für XAML 2009. Weitere Informationen über integrierte Typen für XAML 2009 finden Sie unter XAML 2009-Sprachprimitive.

Wichtig

Das Definieren generischer Klassen in .NET MAUI XAML mit der x:TypeArguments-Direktive wird nicht unterstützt.

Mehrere Typargumente können mithilfe eines Kommastrennzeichens angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, sollten die geschachtelten Argumente für den Typ der Einschränkung in Klammern gesetzt werden.

Hinweis

Die x:Type-Markuperweiterung stellt einen Common Language Runtime (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.

Argument für einen einfachen Grundtyp

Ein einzelnes Grundtypargument kann mithilfe der x:TypeArguments-Direktive als präfixiertes Zeichenfolgenargument angegeben werden:

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

In diesem Beispiel wird System.Collections.Generic als der scg-XAML-Namespace definiert. Die CollectionView.ItemsSource-Eigenschaft wird auf ein List<T> festgelegt, die mit einem string-Typargument instanziert wird. Das geschieht mithilfe des integrierten x:String-Typ von XAML 2009. Die List<string>-Auflistung wird mit mehreren string-Elementen initialisiert.

Alternativ kann die List<T>-Sammlung aber entsprechend mit dem CLR-Typ String instanziiert werden:

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

Argument „Einzelner Objekttyp“

Ein einzelnes Objekttypargument kann mithilfe der x:TypeArguments-Direktive als präfixiertes Zeichenfolgenargument angegeben werden:

<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>
                <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 wird GenericsDemo.Models als der models-XAML-Namespace definiert und System.Collections.Generic ist definiert als der scg-XAML-Namespace. Die CollectionView.ItemsSource-Eigenschaft wird auf ein List<T>-Typargument festgelegt, das mit einem Monkey-Typargument instanziiert wird. Die List<Monkey>-Auflistung wird mit mehreren Monkey-Elementen initialisiert, und einem DataTemplate, das das Erscheinungsbild jedes Monkey-Objekts definiert und als das ItemTemplate der CollectionView festgelegt wird.

Mehrere Typargumente

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

<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>
                <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 wird GenericsDemo.Models als der models-XAML-Namespace definiert und System.Collections.Generic ist definiert als der scg-XAML-Namespace. Die CollectionView.ItemsSource-Eigenschaft wird auf eine List<T> mit einer KeyValuePair<TKey, TValue>-Einschränkung instanziiert, mit den inneren Einschränkungstypargumenten string und Monkey. Die List<KeyValuePair<string,Monkey>>-Auflistung wird mit mehreren KeyValuePair-Elementen initialisiert, wobei der nicht standardmäßige KeyValuePair-Konstruktor verwendet wird, und ein DataTemplate-Objekt, das die Darstellung jedes Monkey-Objekts definiert, wird als ItemTemplate von CollectionView festgelegt. Informationen zum Übergeben von Argumenten an einen nicht standardmäßigen Konstruktor finden Sie unter Pass-Konstruktorargumente.