Udostępnij za pośrednictwem


Generyczne

Język XAML w wieloplatformowych aplikacjach .NET (.NET MAUI) zapewnia obsługę użycia ogólnych typów CLR, poprzez określenie ogólnych ograniczeń jako argumentów typu. Ta obsługa jest zapewniana przez dyrektywę x:TypeArguments, która przekazuje argumenty typu ograniczającego generika do konstruktora generika.

Argumenty typu są określane jako ciąg i są zwykle prefiksowane, takie jak sys:String i sys:Int32. Prefiksowanie jest wymagane, ponieważ typowe typy ograniczeń ogólnych CLR pochodzą z bibliotek, które nie są mapowane na domyślne przestrzenie nazw .NET MAUI. Jednak wbudowane typy XAML 2009, takie jak x:String i x:Int32, można również określić jako argumenty typu, gdzie x jest przestrzenią nazw języka XAML dla XAML 2009. Aby uzyskać więcej informacji na temat wbudowanych typów XAML 2009, zobacz XAML 2009 Language Primitives.

Ważny

Definiowanie typów ogólnych w kodzie XAML programu .NET MAUI z dyrektywą x:TypeArguments jest nieobsługiwane.

Argumenty wielu typów można określić za pomocą ogranicznika przecinka. Ponadto, jeśli ograniczenie ogólne używa typów ogólnych, zagnieżdżone argumenty typu ograniczeń powinny być zawarte w nawiasach.

Notatka

Rozszerzenie składni x:Type dostarcza odwołanie do typu środowiska uruchomieniowego .NET (CLR) dla typu ogólnego i pełni funkcję podobną do operatora typeof w języku C#. Aby uzyskać więcej informacji, zobacz x:Type markup extension.

Aby uzyskać informacje na temat określania typów ogólnych w kodzie XAML w .NET MAUI za pomocą dyrektyw x:DataType i x:Type, zobacz Wiązania kompilacji, które określają typ ogólny oraz rozszerzenie znaczników x:Type.

Argument pojedynczego typu pierwotnego

Jeden argument typu prymitywnego można określić jako argument w formie ciągu z prefiksem przy użyciu dyrektywy 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>

W tym przykładzie System.Collections.Generic jest definiowana jako scg przestrzeni nazw XAML. Właściwość CollectionView.ItemsSource jest ustawiona na List<T>, która jest tworzona za pomocą argumentu typu string przy użyciu wbudowanego typu XAML 2009 x:String. Kolekcja List<string> jest inicjowana z wieloma elementami string.

Alternatywnie można utworzyć wystąpienie kolekcji List<T> przy użyciu typu String CLR:

<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 typu pojedynczego obiektu

Argument typu pojedynczego obiektu można określić jako argument ciągu prefiksu przy użyciu dyrektywy 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>
                <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>

W tym przykładzie GenericsDemo.Models jest definiowana jako przestrzeń nazw models XAML, a System.Collections.Generic jest definiowana jako przestrzeń nazw scg XAML. Właściwość CollectionView.ItemsSource jest ustawiona na List<T>, która jest utworzona przy użyciu argumentu typu Monkey. Kolekcja List<Monkey> jest inicjowana wieloma elementami Monkey, a DataTemplate, który definiuje wygląd każdego obiektu Monkey, jest ustawiany jako ItemTemplate dla CollectionView.

Argumenty wielokrotnego typu

Argumenty wielu typów można określić jako prefiksowe argumenty ciągów rozdzielane przecinkami przy użyciu dyrektywy x:TypeArguments. Gdy ograniczenie ogólne używa typów ogólnych, argumenty typu ograniczenia zagnieżdżonego są zawarte w nawiasach:

<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    

W tym przykładzie GenericsDemo.Models jest definiowana jako przestrzeń nazw models XAML, a System.Collections.Generic jest definiowana jako przestrzeń nazw scg XAML. Właściwość CollectionView.ItemsSource jest ustawiona na List<T>, która tworzy wystąpienie z ograniczeniem KeyValuePair<TKey, TValue>, z argumentami typu ograniczeń wewnętrznych string i Monkey. Kolekcja List<KeyValuePair<string,Monkey>> jest inicjalizowana z wieloma elementami KeyValuePair, wykorzystując konstruktora KeyValuePair innego niż domyślny, i DataTemplate, który definiuje wygląd każdego obiektu Monkey, jest ustawiony jako ItemTemplate z CollectionView. Aby uzyskać informacje na temat przekazywania argumentów do konstruktora innego niż domyślny, zobacz Przekazywanie argumentów do konstruktora.