Поделиться через


Дженерики

XAML для многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) обеспечивает поддержку использования универсальных типов CLR, указав универсальные ограничения в качестве аргументов типа. Эта поддержка предоставляется директивой x:TypeArguments, которая передает ограничивающие аргументы универсального типа конструктору этого универсального типа.

Аргументы типа указываются в виде строки и обычно префиксируются, например sys:String и sys:Int32. Добавление префикса требуется, так как типичные универсальные ограничения CLR происходят из библиотек, которые не сопоставлены с пространствами имен .NET MAUI по умолчанию. Однако встроенные типы XAML 2009, такие как x:String и x:Int32, также можно указать в качестве аргументов типа, где x — это пространство имен языка XAML для XAML 2009. Дополнительные сведения о встроенных типах XAML 2009 см. в примитивах языка XAML 2009.

Важный

Определение универсальных типов в XAML .NET MAUI с помощью директивы x:TypeArguments не поддерживается.

Несколько аргументов типа можно указать с помощью разделителя-запятой. Кроме того, если универсальное ограничение использует универсальные типы, аргументы типа вложенных ограничений должны содержаться в скобках.

Заметка

Расширение разметки x:Type предоставляет ссылку на тип CLR для универсального типа и имеет аналогичную функцию оператору typeof в C#. Дополнительные сведения см. в расширении разметки x:Type.

Сведения об указании универсальных типов в XAML .NET MAUI с директивами x:DataType и x:Type см. в привязках компиляции, которые указывают универсальный тип и расширения разметки x:Type.

Аргумент одного примитивного типа

Один аргумент типа примитива можно указать как префиксный строковый аргумент с помощью директивы 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>

В этом примере System.Collections.Generic определяется как пространство имен XAML scg. Свойство CollectionView.ItemsSource имеет значение List<T>, созданное с аргументом типа string с помощью встроенного x:String типа XAML 2009. Коллекция List<string> инициализируется с несколькими элементами string.

Альтернативно, но эквивалентно, List<T> коллекцию можно создать, с помощью типа CLR String.

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

Аргумент типа одного объекта

Один аргумент типа объекта можно указать как префиксный строковый аргумент с помощью директивы 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>

В этом примере GenericsDemo.Models определяется как пространство имен XAML models, а System.Collections.Generic определяется как пространство имен XAML scg. Свойство CollectionView.ItemsSource имеет значение List<T>, созданное с аргументом типа Monkey. Коллекция List<Monkey> инициализирована несколькими элементами Monkey, а DataTemplate, который определяет внешний вид каждого объекта Monkey, устанавливается в качестве ItemTemplateCollectionView.

Аргументы нескольких типов

Несколько аргументов типа можно указать как префиксированные строковые аргументы, разделенные запятой, с помощью директивы 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="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    

В этом примере GenericsDemo.Models определяется как пространство имен XAML models, а System.Collections.Generic определяется как пространство имен XAML scg. Свойству CollectionView.ItemsSource присвоено значение List<T>, созданное с ограничением KeyValuePair<TKey, TValue> и с аргументами типа внутреннего ограничения string и Monkey. Коллекция List<KeyValuePair<string,Monkey>> инициализирована с несколькими элементами KeyValuePair, используя не стандартный конструктор KeyValuePair, а DataTemplate, который определяет внешний вид каждого объекта Monkey, и установлен как ItemTemplate для CollectionView. Сведения о передаче аргументов конструктору, который не является конструктором по умолчанию, см. в разделе «Передача аргументов конструктору».