Xamarin.Forms Ścieżka powiązania
We wszystkich poprzednich przykładach Path
powiązania danych właściwość Binding
klasy (lub Path
właściwość Binding
rozszerzenia znaczników) została ustawiona na jedną właściwość. W rzeczywistości można ustawić Path
właściwość podrzędną (właściwość właściwości) lub element członkowski kolekcji.
Załóżmy na przykład, że strona zawiera element TimePicker
:
<TimePicker x:Name="timePicker">
Właściwość Time
TimePicker
jest typu TimeSpan
, ale być może chcesz utworzyć powiązanie danych odwołujące się do TotalSeconds
właściwości tej TimeSpan
wartości. Oto powiązanie danych:
{Binding Source={x:Reference timePicker},
Path=Time.TotalSeconds}
Właściwość Time
ma typ TimeSpan
, który ma TotalSeconds
właściwość . Właściwości Time
i TotalSeconds
są po prostu połączone z kropką. Elementy w Path
ciągu zawsze odwołują się do właściwości, a nie do typów tych właściwości.
Ten przykład i kilka innych są wyświetlane na stronie Odmiany ścieżki :
<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>
W drugim Label
źródle powiązania jest sama strona. Właściwość Content
ma typ StackLayout
, który ma Children
właściwość typu IList<View>
, która ma właściwość wskazującą Count
liczbę elementów podrzędnych.
Ścieżki z indeksatorami
Powiązanie w trzecim Label
miejscu na stronach Odmian ścieżki odwołuje się do CultureInfo
klasy w System.Globalization
przestrzeni nazw:
<Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
Path=DateTimeFormat.DayNames[3],
StringFormat='The middle day of the week is {0}'}" />
Źródło jest ustawione na właściwość statyczną CultureInfo.CurrentCulture
, która jest obiektem typu CultureInfo
. Ta klasa definiuje właściwość o nazwie DateTimeFormat
typu DateTimeFormatInfo
zawierającego DayNames
kolekcję. Indeks wybiera czwarty element.
Czwarty Label
robi coś podobnego, ale dla kultury związanej z Francją. Właściwość Source
powiązania jest ustawiana na CultureInfo
obiekt z 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>
Aby uzyskać więcej informacji na temat określania argumentów konstruktora w języku XAML, zobacz Przekazywanie argumentów konstruktora.
Na koniec ostatni przykład jest podobny do drugiego, z tą różnicą, że odwołuje się do jednego z elementów podrzędnych elementu StackLayout
:
<Label Text="{Binding Source={x:Reference page},
Path=Content.Children[1].Text.Length,
StringFormat='The first Label has {0} characters'}" />
To dziecko jest elementem Label
Text
, który ma właściwość typu String
, która ma Length
właściwość . Pierwszy Label
raportuje TimeSpan
zestaw w elemecie TimePicker
, więc po zmianie tekstu ostateczne Label
zmiany również.
Oto uruchomiony program:
Debugowanie złożonych ścieżek
Złożone definicje ścieżek mogą być trudne do skonstruowania: musisz znać typ każdej właściwości podrzędnej lub typ elementów w kolekcji, aby poprawnie dodać następną właściwość podrzędną, ale same typy nie są wyświetlane w ścieżce. Jedną z dobrych technik jest utworzenie ścieżki przyrostowo i przyjrzenie się wynikom pośrednim. W tym ostatnim przykładzie można zacząć od żadnej Path
definicji:
<Label Text="{Binding Source={x:Reference page},
StringFormat='{0}'}" />
Spowoduje to wyświetlenie typu źródła powiązania lub DataBindingDemos.PathVariationsPage
. Wiadomo, że PathVariationsPage
pochodzi z ContentPage
klasy , więc ma Content
właściwość :
<Label Text="{Binding Source={x:Reference page},
Path=Content,
StringFormat='{0}'}" />
Typ Content
właściwości jest teraz ujawniany jako Xamarin.Forms.StackLayout
. Children
Dodaj właściwość do Path
klasy , a typ to Xamarin.Forms.ElementCollection'1[Xamarin.Forms.View]
, która jest klasą wewnętrzną do Xamarin.Formsklasy , ale oczywiście typem kolekcji. Dodaj do tego indeks i typ to Xamarin.Forms.Label
. Kontynuuj w ten sposób.
W miarę Xamarin.Forms przetwarzania ścieżki powiązania program obsługi jest instalowany PropertyChanged
na dowolnym obiekcie w ścieżce, która implementuje INotifyPropertyChanged
interfejs. Na przykład ostateczne powiązanie reaguje na zmianę w pierwszej Label
kolejności, ponieważ Text
właściwość się zmienia.
Jeśli właściwość w ścieżce powiązania nie implementuje INotifyPropertyChanged
, wszelkie zmiany tej właściwości zostaną zignorowane. Niektóre zmiany mogą całkowicie unieważnić ścieżkę powiązania, dlatego należy użyć tej techniki tylko wtedy, gdy ciąg właściwości i właściwości podrzędnych nigdy nie staną się nieprawidłowe.