Obecné typy v Xamarin.Forms XAML
Xamarin.Forms XAML poskytuje podporu pro využívání obecných typů CLR zadáním obecných omezení jako argumentů typu. Tato podpora je poskytována x:TypeArguments
direktivou, která předává argumenty omezujícího typu obecného konstruktoru obecného typu.
Důležité
Definování obecných tříd v Xamarin.Forms XAML s direktivou x:TypeArguments
není podporováno.
Argumenty typu jsou zadány jako řetězec a obvykle mají předponu, například sys:String
a sys:Int32
. Předpona je povinná, protože typické typy obecných omezení CLR pocházejí z knihoven, které nejsou namapované na výchozí Xamarin.Forms obor názvů. Předdefinované typy XAML 2009, například x:String
a x:Int32
, lze také zadat jako argumenty typu, kde x
je obor názvů jazyka XAML pro XAML 2009. Další informace o předdefinovaných typech XAML 2009 najdete v tématu Primitiv jazyka XAML 2009.
Více argumentů typu lze zadat pomocí oddělovače čárky. Kromě toho platí, že pokud obecné omezení používá obecné typy, měly by být argumenty vnořeného typu omezení obsaženy v závorkách.
Poznámka:
Rozšíření x:Type
značek poskytuje odkaz na typ CLR pro obecný typ a má podobnou funkci jako typeof
operátor v jazyce C#. Další informace naleznete v tématu x:Type rozšíření značek.
Argument jednoho primitivního typu
Jeden argument primitivního typu lze zadat jako předponu řetězcového argumentu pomocí direktivy x:TypeArguments
:
<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>
V tomto příkladu System.Collections.Generic
scg
je definován jako obor názvů XAML. Vlastnost CollectionView.ItemsSource
je nastavena na List<T>
instanci s argumentem string
typu pomocí integrovaného x:String
typu XAML 2009. Kolekce List<string>
se inicializuje s více string
položkami.
Alternativně List<T>
lze kolekci vytvořit instanci s typem 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 jeden objekt
Jeden argument typu objektu lze zadat jako předponu řetězcového argumentu pomocí direktivy x:TypeArguments
:
<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>
V tomto příkladu GenericsDemo.Models
models
je definován jako obor názvů XAML a System.Collections.Generic
je definován jako scg
obor názvů XAML. Vlastnost CollectionView.ItemsSource
je nastavena na List<T>
instanci s argumentem Monkey
typu. Kolekce List<Monkey>
je inicializována s více Monkey
položkami a DataTemplate
která definuje vzhled každého Monkey
objektu CollectionView
je nastaven jako ItemTemplate
objekt .
Více argumentů typu
Více argumentů typu lze zadat jako předpony řetězcové argumenty oddělené čárkou pomocí direktivy x:TypeArguments
. Pokud obecné omezení používá obecné typy, jsou argumenty vnořeného typu omezení obsaženy v závorkách:
<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
V tomto příkladu GenericsDemo.Models
models
je definován jako obor názvů XAML a System.Collections.Generic
je definován jako scg
obor názvů XAML. Vlastnost CollectionView.ItemsSource
je nastavena na List<T>
instanci KeyValuePair<TKey, TValue>
s omezením, s vnitřními argumenty string
typu omezení a Monkey
. Kolekce List<KeyValuePair<string,Monkey>>
je inicializována s více KeyValuePair
položkami, pomocí non-default KeyValuePair
konstruktoru, a DataTemplate
který definuje vzhled každého Monkey
objektu je nastaven jako ItemTemplate
.CollectionView
Informace o předávání argumentů do jiného než výchozího konstruktoru naleznete v tématu Předávání argumentů konstruktoru.