Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önceki tüm veri bağlama örneklerinde sınıfın Path Binding özelliği (veya Path işaretleme uzantısının Binding özelliği) tek bir özelliğe ayarlanmıştır. Aslında bir alt özelliğe (özelliğin özelliği) veya bir koleksiyonun üyesine ayarlamak Path mümkündür.
Örneğin, sayfanızın bir TimePickeriçerdiğini varsayalım:
<TimePicker x:Name="timePicker">
özelliği türündedirTimeSpan, ancak bu değerin özelliğine TotalSeconds başvuran bir veri bağlaması TimeSpan oluşturmak isteyebilirsiniz.TimePicker Time Veri bağlama şu şekildedir:
{Binding Source={x:Reference timePicker},
Path=Time.TotalSeconds}
Time özelliği, özelliği TotalSeconds olan türündedirTimeSpan. Time ve TotalSeconds özellikleri yalnızca bir nokta ile bağlanır. Dizedeki Path öğeler her zaman bu özelliklerin türlerine değil özelliklere başvurur.
Bu örnek ve birkaç diğer örnek, Yol Çeşitlemeleri sayfasında gösterilir:
<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>
İkincisinde Labelbağlama kaynağı sayfanın kendisidir. Content özelliği, türünde bir Children özelliği IList<View>olan ve alt öğe sayısını belirten bir Count özelliği olan türündedirStackLayout.
Dizin Oluşturuculu Yollar
Yol Varyasyonları sayfalarında üçüncüdeki Label bağlama, ad alanında sınıfına System.Globalization başvururCultureInfo:
<Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
Path=DateTimeFormat.DayNames[3],
StringFormat='The middle day of the week is {0}'}" />
Kaynak, türündeki CultureInfobir nesne olan statik CultureInfo.CurrentCulture özelliğe ayarlanır. Bu sınıf, koleksiyon içeren türünde DateTimeFormatInfo adlı DateTimeFormat bir DayNames özellik tanımlar. Dizin dördüncü öğeyi seçer.
Dördüncüsü Label benzer bir şey yapar, ancak Fransa ile ilişkili kültür için. Source Bağlamanın özelliği bir oluşturucu ile nesne olarak CultureInfo ayarlanır:
<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>
XAML'de oluşturucu bağımsız değişkenlerini belirtme hakkında daha fazla ayrıntı için bkz. Oluşturucu Bağımsız Değişkenlerini Geçirme.
Son olarak, son örnek ikincisine benzer, ancak öğesinin alt öğelerinden birine başvurur StackLayout:
<Label Text="{Binding Source={x:Reference page},
Path=Content.Children[1].Text.Length,
StringFormat='The first Label has {0} characters'}" />
Bu alt öğe, özelliği olan türünde Stringbir Text özelliği olan bir Length öğesidirLabel. İlki Label içindeki TimePickerkümeyi TimeSpan raporladığından, bu metin değiştiğinde son Label değişiklikler de değişir.
Çalışan program şu şekildedir:
Karmaşık Yollarda Hata Ayıklama
Karmaşık yol tanımlarını oluşturmak zor olabilir: Sonraki alt özelliği doğru şekilde eklemek için her alt özelliğin türünü veya koleksiyondaki öğelerin türünü bilmeniz gerekir, ancak türlerin kendileri yolda görünmez. İyi bir teknik, yolu artımlı olarak oluşturmak ve ara sonuçlara bakmaktır. Bu son örnek için hiç tanım olmadan Path başlayabilirsiniz:
<Label Text="{Binding Source={x:Reference page},
StringFormat='{0}'}" />
Bağlama kaynağının DataBindingDemos.PathVariationsPageveya türünü görüntüler. 'den ContentPagetüretilir, PathVariationsPage bu nedenle bir Content özelliği vardır:
<Label Text="{Binding Source={x:Reference page},
Path=Content,
StringFormat='{0}'}" />
Özelliğin Content türü artık olarak Xamarin.Forms.StackLayoutgösterilir. Children öğesine özelliğini Path ekleyin ve türü, Xamarin.Forms.ElementCollection'1[Xamarin.Forms.View]için bir Xamarin.Formssınıf olan ancak açıkça bir koleksiyon türü olan şeklindedir. Buna bir dizin eklediğinizde türü olur Xamarin.Forms.Label. Bu şekilde devam edin.
Bağlama yolunu işlerkenXamarin.Forms, arabirimini uygulayan INotifyPropertyChanged yoldaki herhangi bir nesneye bir PropertyChanged işleyici yükler. Örneğin, özellik değiştiğinden son bağlama ilkindeki Label bir değişikliğe Text tepki gösterir.
Bağlama yolundaki bir özellik uygulamazsa INotifyPropertyChanged, bu özellikte yapılan değişiklikler yoksayılır. Bazı değişiklikler bağlama yolunu tamamen geçersiz kılabilir, bu nedenle bu tekniği yalnızca özellik dizesi ve alt özellikler hiçbir zaman geçersiz olmadığında kullanmalısınız.
