Typy ogólne w Xamarin.Forms języku XAML
Xamarin.Forms Język XAML zapewnia obsługę korzystania z ogólnych typów CLR przez określenie ogólnych ograniczeń jako argumentów typu. Ta obsługa jest dostarczana przez dyrektywę x:TypeArguments
, która przekazuje argumenty typu ograniczenia ogólnego do konstruktora typu ogólnego.
Ważne
Definiowanie klas ogólnych w Xamarin.Forms języku XAML z dyrektywą x:TypeArguments
nie jest obsługiwane.
Argumenty typu są określane jako ciąg i są zwykle poprzedzone prefiksem, takimi 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ślną Xamarin.Forms przestrzeń nazw. 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 języka XAML 2009. Aby uzyskać więcej informacji na temat wbudowanych typów XAML 2009, zobacz XAML 2009 Language Primitives (Typy pierwotne języka XAML 2009).
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.
Uwaga
Rozszerzenie x:Type
znaczników dostarcza odwołanie do typu CLR dla typu ogólnego i ma podobną funkcję do typeof
operatora w języku C#. Aby uzyskać więcej informacji, zobacz x:Type markup extension (Rozszerzenie znaczników x:Type).
Argument pojedynczego typu pierwotnego
Argument pojedynczego typu pierwotnego można określić jako argument ciągu prefiksu przy użyciu x:TypeArguments
dyrektywy :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
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 scg
jako przestrzeń nazw XAML. Właściwość CollectionView.ItemsSource
jest ustawiona na wystąpienie List<T>
argumentu typu przy użyciu wbudowanego string
x:String
typu XAML 2009. Kolekcja List<string>
jest inicjowana z wieloma string
elementami.
Alternatywnie, ale równoważnie, List<T>
kolekcję można utworzyć za pomocą typu CLR String
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
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 x:TypeArguments
dyrektywy :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
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 models
jako przestrzeń nazw XAML i System.Collections.Generic
jest definiowana jako scg
przestrzeń nazw XAML. Właściwość CollectionView.ItemsSource
jest ustawiona na wystąpienie List<T>
argumentu Monkey
typu. Kolekcja List<Monkey>
jest inicjowana z wieloma Monkey
elementami, a element DataTemplate
definiujący wygląd każdego Monkey
obiektu jest ustawiany jako ItemTemplate
CollectionView
element .
Argumenty wielokrotnego typu
Argumenty wielu typów można określić jako prefiksowe argumenty ciągów rozdzielane przecinkami przy użyciu x:TypeArguments
dyrektywy . Gdy ograniczenie ogólne używa typów ogólnych, argumenty typu ograniczenia zagnieżdżonego są zawarte w nawiasach:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
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 models
jako przestrzeń nazw XAML i System.Collections.Generic
jest definiowana jako scg
przestrzeń nazw XAML. Właściwość CollectionView.ItemsSource
jest ustawiona na wystąpienie List<T>
obiektu z ograniczeniem KeyValuePair<TKey, TValue>
z argumentami string
typu ograniczeń wewnętrznych i Monkey
. Kolekcja List<KeyValuePair<string,Monkey>>
jest inicjowana z wieloma KeyValuePair
elementami, przy użyciu konstruktora innego niż domyślny KeyValuePair
, a obiekt DataTemplate
definiujący wygląd każdego Monkey
obiektu jest ustawiany jako ItemTemplate
CollectionView
element . Aby uzyskać informacje na temat przekazywania argumentów do konstruktora innego niż domyślny, zobacz Przekazywanie argumentów konstruktora.