Sdílet prostřednictvím


Xamarin.Forms Cesta vazby

Ve všech předchozích příkladech Path datových vazeb byla vlastnost Binding třídy (nebo Path vlastnosti Binding rozšíření značek) nastavena na jednu vlastnost. Ve skutečnosti je možné nastavit Path dílčí vlastnost (vlastnost vlastnosti) nebo člena kolekce.

Předpokládejme například, že vaše stránka obsahuje TimePicker:

<TimePicker x:Name="timePicker">

Vlastnost Time TimePicker je typu TimeSpan, ale možná chcete vytvořit datovou vazbu, která odkazuje na TotalSeconds vlastnost této TimeSpan hodnoty. Tady je datová vazba:

{Binding Source={x:Reference timePicker},
         Path=Time.TotalSeconds}

Vlastnost Time je typu TimeSpan, který má TotalSeconds vlastnost. Vlastnosti Time jsou TotalSeconds jednoduše spojené s tečkou. Položky v řetězci Path vždy odkazují na vlastnosti, nikoli na typy těchto vlastností.

Tento příklad a několik dalších se zobrazí na stránce Varianty cesty:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:globe="clr-namespace:System.Globalization;assembly=netstandard"
             x:Class="DataBindingDemos.PathVariationsPage"
             Title="Path Variations"
             x:Name="page">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Label">
                <Setter Property="FontSize" Value="Large" />
                <Setter Property="HorizontalTextAlignment" Value="Center" />
                <Setter Property="VerticalOptions" Value="CenterAndExpand" />
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout Margin="10, 0">
        <TimePicker x:Name="timePicker" />

        <Label Text="{Binding Source={x:Reference timePicker},
                              Path=Time.TotalSeconds,
                              StringFormat='{0} total seconds'}" />

        <Label Text="{Binding Source={x:Reference page},
                              Path=Content.Children.Count,
                              StringFormat='There are {0} children in this StackLayout'}" />

        <Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
                              Path=DateTimeFormat.DayNames[3],
                              StringFormat='The middle day of the week is {0}'}" />

        <Label>
            <Label.Text>
                <Binding Path="DateTimeFormat.DayNames[3]"
                         StringFormat="The middle day of the week in France is {0}">
                    <Binding.Source>
                        <globe:CultureInfo>
                            <x:Arguments>
                                <x:String>fr-FR</x:String>
                            </x:Arguments>
                        </globe:CultureInfo>
                    </Binding.Source>
                </Binding>
            </Label.Text>
        </Label>

        <Label Text="{Binding Source={x:Reference page},
                              Path=Content.Children[1].Text.Length,
                              StringFormat='The second Label has {0} characters'}" />
    </StackLayout>
</ContentPage>

Ve druhé Labelčásti je zdrojem vazby samotná stránka. Vlastnost Content je typu StackLayout, který má Children vlastnost typu IList<View>, která má Count vlastnost označující počet podřízených položek.

Cesty s indexery

Vazba ve třetí Label části stránky variant cesty odkazuje na CultureInfo třídu v System.Globalization oboru názvů:

<Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
                      Path=DateTimeFormat.DayNames[3],
                      StringFormat='The middle day of the week is {0}'}" />

Zdroj je nastaven na statickou CultureInfo.CurrentCulture vlastnost, což je objekt typu CultureInfo. Tato třída definuje vlastnost s názvem DateTimeFormat typu DateTimeFormatInfo , která obsahuje kolekci DayNames . Index vybere čtvrtou položku.

Čtvrtý Label dělá něco podobného, ale pro kulturu spojenou s Francií. Vlastnost Source vazby je nastavena na CultureInfo objekt s konstruktorem:

<Label>
    <Label.Text>
        <Binding Path="DateTimeFormat.DayNames[3]"
                 StringFormat="The middle day of the week in France is {0}">
            <Binding.Source>
                <globe:CultureInfo>
                    <x:Arguments>
                        <x:String>fr-FR</x:String>
                    </x:Arguments>
                </globe:CultureInfo>
            </Binding.Source>
        </Binding>
    </Label.Text>
</Label>

Další podrobnosti o zadávání argumentů konstruktoru v xaml naleznete v tématu Předávání argumentů konstruktoru.

Poslední příklad je podobný druhému, s tím rozdílem, že odkazuje na jednu z podřízených položek StackLayout:

<Label Text="{Binding Source={x:Reference page},
                      Path=Content.Children[1].Text.Length,
                      StringFormat='The first Label has {0} characters'}" />

Toto dítě je , Labelkterý má Text vlastnost typu String, která má Length vlastnost. První Label hlásí TimeSpan sadu v sadě TimePicker, takže když se text změní, konečné Label změny také.

Tady je spuštěný program:

Varianty cest

Ladění složitých cest

Složité definice cest mohou být obtížné sestavit: Potřebujete znát typ každé dílčí vlastnosti nebo typ položek v kolekci, aby bylo možné správně přidat další dílčí vlastnost, ale samotné typy se v cestě nezobrazí. Jednou z vhodných technik je vytvořit cestu přírůstkově a podívat se na průběžné výsledky. V posledním příkladu byste mohli začít bez definice Path :

<Label Text="{Binding Source={x:Reference page},
                      StringFormat='{0}'}" />

Zobrazí se typ zdroje vazby nebo DataBindingDemos.PathVariationsPage. Víte, PathVariationsPage že odvozuje , ContentPagetakže má Content vlastnost:

<Label Text="{Binding Source={x:Reference page},
                      Path=Content,
                      StringFormat='{0}'}" />

Content Typ vlastnosti je nyní odhalen být Xamarin.Forms.StackLayout. Children Přidejte vlastnost do Path a typ je , což je Xamarin.Forms.ElementCollection'1[Xamarin.Forms.View]třída interní pro Xamarin.Forms, ale samozřejmě typ kolekce. Přidejte do toho index a typ je Xamarin.Forms.Label. Pokračujte tímto způsobem.

Při Xamarin.Forms zpracování cesty vazby nainstaluje obslužnou rutinu PropertyChanged na libovolný objekt v cestě, která implementuje INotifyPropertyChanged rozhraní. Poslední vazba například reaguje na změnu v první Label části, protože se Text vlastnost změní.

Pokud vlastnost v cestě vazby neimplementuje INotifyPropertyChanged, budou všechny změny této vlastnosti ignorovány. Některé změny by mohly zcela zneplatnit cestu vazby, takže tuto techniku byste měli použít pouze v případě, že řetězec vlastností a dílčích vlastností nikdy nebude neplatný.