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 , Label
který 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:
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 , ContentPage
takž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ý.