Delen via


Generieken

.NET Multi-Platform App UI (.NET MAUI) XAML biedt ondersteuning voor het gebruik van algemene CLR-typen door de algemene beperkingen op te geven als typeargumenten. Deze ondersteuning wordt geboden door de x:TypeArguments richtlijn, die de beperkende typeargumenten van een generiek doorgeeft aan de constructor van het generieke type.

Typeargumenten worden opgegeven als een tekenreeks en worden meestal voorafgegaan door sys:String en sys:Int32. Voorvoegsel is vereist omdat de typische typen algemene CLR-beperkingen afkomstig zijn van bibliotheken die niet zijn toegewezen aan de standaard .NET MAUI-naamruimten. De ingebouwde XAML 2009-typen, zoals x:String en x:Int32, kunnen echter ook worden opgegeven als typeargumenten, waarbij x de XAML-taalnaamruimte is voor XAML 2009. Zie XAML 2009 Language Primitivesvoor meer informatie over de ingebouwde XAML 2009-typen.

Belangrijk

Het definiëren van algemene typen in .NET MAUI XAML, met de x:TypeArguments-instructie, wordt niet ondersteund.

U kunt meerdere typeargumenten opgeven met behulp van een kommascheidingsteken. Bovendien, als voor een generieke beperking generieke typen worden gebruikt, moeten de geneste argumenten van het beperkingstype tussen haakjes staan.

Notitie

De x:Type markeringsextensie levert een CLR-typeverwijzing (Common Language Runtime) voor een algemeen type en heeft een vergelijkbare functie als de typeof-operator in C#. Zie x:Type markeringsextensievoor meer informatie.

Zie Compileer bindingen die een generiek type specificeren en x:Type markup-extensionvoor informatie over het specificeren van generieke typen in .NET MAUI XAML, met behulp van de richtlijnen x:DataType en x:Type.

Argument voor één primitief type

Eén primitief typeargument kan worden opgegeven als een voorvoegseltekenreeksargument met behulp van de x:TypeArguments-instructie:

<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 dit voorbeeld wordt System.Collections.Generic gedefinieerd als de scg XAML-naamruimte. De eigenschap CollectionView.ItemsSource is ingesteld op een List<T> die wordt geïnstantieerd met een string typeargument, met behulp van het ingebouwde x:String type XAML 2009. De List<string> verzameling wordt geïnitialiseerd met meerdere string items.

Als alternatief, maar evenwaardig, kan de List<T> verzameling worden geïnstantieerd met het CLR String type.

<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 voor enkel objecttype

Een argument voor één objecttype kan worden opgegeven als een voorvoegseltekenreeksargument met behulp van de x:TypeArguments-instructie:

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

In dit voorbeeld wordt GenericsDemo.Models gedefinieerd als de models XAML-naamruimte en wordt System.Collections.Generic gedefinieerd als de scg XAML-naamruimte. De eigenschap CollectionView.ItemsSource is ingesteld op een List<T> die wordt geïnstantieerd met een Monkey typeargument. De List<Monkey> verzameling wordt geïnitialiseerd met meerdere Monkey items en een DataTemplate waarmee het uiterlijk van elk Monkey object wordt gedefinieerd als de ItemTemplate van de CollectionView.

Argumenten voor meerdere typen

Meerdere typeargumenten kunnen worden opgegeven als voorvoegseltekenreeksargumenten, gescheiden door een komma, met behulp van de x:TypeArguments instructie. Wanneer een algemene beperking algemene typen gebruikt, worden de geneste beperkingstypeargumenten tussen haakjes weergegeven:

<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    

In dit voorbeeld wordt GenericsDemo.Models gedefinieerd als de models XAML-naamruimte en wordt System.Collections.Generic gedefinieerd als de scg XAML-naamruimte. De eigenschap CollectionView.ItemsSource is ingesteld op een List<T> die wordt geïnstantieerd met een KeyValuePair<TKey, TValue> beperking, met de binnenste beperkingstypeargumenten string en Monkey. De List<KeyValuePair<string,Monkey>>-verzameling wordt geïnitialiseerd met meerdere KeyValuePair-items, met behulp van de niet-standaard KeyValuePair-constructor, en een DataTemplate die het uiterlijk van elk Monkey-object definieert, wordt ingesteld als de ItemTemplate voor de CollectionView. Zie Argumenten doorgevenvoor informatie over het doorgeven van argumenten aan een niet-standaardconstructor.