Sdílet prostřednictvím


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 CollectionViewje 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.