Sdílet prostřednictvím


Generika

.NET Multi-platform App UI (.NET MAUI) XAML poskytuje podporu pro využívání obecných typů CLR zadáním obecných omezení jako argumentů typu. Tato podpora je poskytována direktivou x:TypeArguments, která předává argumenty omezujícího typu obecného konstruktoru obecného typu.

Argumenty typu jsou zadány jako řetězec a obvykle mají předponu, například sys:String a sys:Int32. Předpona je povinná, protože typické typy obecných omezení CLR pocházejí z knihoven, které nejsou namapované na výchozí obory názvů .NET MAUI. Integrované typy XAML 2009, jako jsou například x:String a x:Int32, je však možné zadat také jako argumenty typu, kde x je obor názvů jazyka XAML pro XAML 2009. Další informace o předdefinovaných typech XAML 2009 naleznete v tématu XAML 2009 Language Primitives.

Důležitý

Definování obecných typů v .NET MAUI XAML s direktivou x:TypeArguments není podporováno.

Více argumentů typu lze zadat pomocí oddělovače čárky. Kromě toho platí, že pokud obecné omezení používá obecné typy, měly by být argumenty vnořeného typu omezení obsaženy v závorkách.

Poznámka

Rozšíření značkovacího modulu x:Type poskytuje referenci typu CLR (Common Language Runtime) pro generický typ a má podobnou funkci jako operátor typeof v jazyce C#. Další informace naleznete v části x:Type markupu.

Informace o zadávání obecných typů v .NET MAUI XAML s direktivami x:DataType a x:Type naleznete v tématu Kompilace vazeb, které určují obecný typ a rozšíření značek x:Type.

Argument jednoho primitivního typu

Jeden argument primitivního typu lze zadat jako předponu řetězcového argumentu pomocí direktivy 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>

V tomto příkladu je System.Collections.Generic definován jako obor názvů XAML scg. Vlastnost CollectionView.ItemsSource je nastavena na List<T>, která je vytvořena pomocí argumentu typu string a využívá integrovaný typ XAML 2009 x:String. Kolekce List<string> se inicializuje s několika položkami string.

Alternativně, ale ekvivalentně, lze kolekci List<T> instanciovat s typem String modulu 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 jednoho objektu

Argument typu jednoho objektu lze zadat jako předponu řetězcového argumentu pomocí direktivy 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 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>

V tomto příkladu je GenericsDemo.Models definován jako models obor názvů XAML a System.Collections.Generic je definován jako scg obor názvů XAML. Vlastnost CollectionView.ItemsSource je nastavena na List<T>, která je vytvořena s typovým argumentem Monkey. Kolekce List<Monkey> je inicializována s více položkami Monkey, a DataTemplate, která definuje vzhled každého objektu Monkey, je nastavena jako ItemTemplate u CollectionView.

Více argumentů typu

Více argumentů typu lze zadat jako řetězcové argumenty s předponou, oddělené čárkou, pomocí direktivy x:TypeArguments. Pokud obecné omezení používá obecné typy, jsou argumenty vnořeného typu omezení obsaženy v závorkách:

<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    

V tomto příkladu je GenericsDemo.Models definován jako models obor názvů XAML a System.Collections.Generic je definován jako scg obor názvů XAML. Vlastnost CollectionView.ItemsSource je nastavena na List<T>, která je vytvořena s omezením KeyValuePair<TKey, TValue>, s argumenty typu vnitřního omezení string a Monkey. Kolekce List<KeyValuePair<string,Monkey>> je inicializována s více položkami KeyValuePair pomocí konstruktoru KeyValuePair, který není výchozí, a DataTemplate, který definuje vzhled každého objektu Monkey, je nastavený jako ItemTemplateCollectionView. Informace o předávání argumentů do jiného než výchozího konstruktoru najdete v tématu Předání argumentů konstruktoru.