Дженерики
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
, устанавливается в качестве ItemTemplate
CollectionView.
Аргументы нескольких типов
Несколько аргументов типа можно указать как префиксированные строковые аргументы, разделенные запятой, с помощью директивы 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. Сведения о передаче аргументов конструктору, который не является конструктором по умолчанию, см. в разделе «Передача аргументов конструктору».