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.