Udostępnij za pośrednictwem


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

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 CollectionViewelement . Aby uzyskać informacje na temat przekazywania argumentów do konstruktora innego niż domyślny, zobacz Przekazywanie argumentów konstruktora.