泛型
.NET Multi-platform App UI (.NET MAUI) XAML 通过将泛型约束指定为类型参数来支持泛型 CLR 类型的使用。 此支持由 x:TypeArguments
指令提供,该指令将泛型的约束类型参数传递给泛型类型的构造函数。
类型参数指定为字符串,通常带前缀,如 sys:String
和 sys:Int32
。 需要带前缀是因为典型类型的 CLR 泛型约束来自未映射到默认 .NET MAUI 命名空间的库。 但是,XAML 2009 内置类型(如 x:String
和 x:Int32
)也可指定为类型参数,其中 x
是 XAML 2009 的 XAML 语言命名空间。 有关 XAML 2009 内置类型的详细信息,请参阅 XAML 2009 语言基元。
重要说明
不支持使用 x:TypeArguments
指令在 .NET MAUI XAML 中定义泛型类。
可使用逗号分隔符指定多个类型参数。 此外,如果泛型约束使用泛型类型,则嵌套的约束类型参数应包含在括号中。
注意
x:Type
标记扩展为泛型类型提供公共语言运行时 (CLR) 类型引用,该扩展的功能类似于 C# 中的 typeof
运算符。 有关详细信息,请参阅 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
定义为 scg
XAML 命名空间。 CollectionView.ItemsSource
属性设置为 List<T>
,后者使用 XAML 2009 内置 x:String
类型通过 string
类型参数进行实例化。 List<string>
集合使用多个 string
项进行初始化。
或者也可以使用 CLR String
类型将 List<T>
集合实例化,效果相同:
<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>
<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
定义为 models
XAML 命名空间,而 System.Collections.Generic
定义为 scg
XAML 命名空间。 CollectionView.ItemsSource
属性设置为 List<T>
,后者通过 Monkey
类型参数进行实例化。 List<Monkey>
集合使用多个 Monkey
项进行初始化,并且用于定义每个 Monkey
对象外观的 DataTemplate
设置为 CollectionView 的 ItemTemplate
。
多个类型参数
可使用 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>
<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
定义为 models
XAML 命名空间,而 System.Collections.Generic
定义为 scg
XAML 命名空间。 CollectionView.ItemsSource
属性设置为 List<T>
,后者通过 KeyValuePair<TKey, TValue>
约束进行实例化,其内部约束类型参数为 string
和 Monkey
。 List<KeyValuePair<string,Monkey>>
集合使用多个 KeyValuePair
项通过非默认 KeyValuePair
构造函数进行初始化,并且用于定义每个 Monkey
对象外观的 DataTemplate
设置为 CollectionView 的 ItemTemplate
。 有关将参数传递给非默认构造函数的信息,请参阅传递构造函数参数。