Xamarin.Forms Derlenmiş Bağlamalar
Derlenen bağlamalar klasik bağlamalara göre daha hızlı çözümlenir ve bu nedenle uygulamalarda veri bağlama performansı Xamarin.Forms iyileştirilir.
Veri bağlamalarının iki ana sorunu vardır:
- Bağlama ifadelerinde derleme zamanı doğrulaması yoktur. Bunun yerine bağlamalar çalışma zamanında çözülür. Bu nedenle, uygulama beklendiği gibi davranmadığında veya hata iletileri görüntülenene kadar çalışma zamanına kadar geçersiz bağlamalar algılanmaz.
- Maliyet verimli değildir. Bağlamalar çalışma zamanında genel amaçlı nesne incelemesi (yansıma) kullanılarak çözülür ve bunu yapmanın yükü platformdan platforma değişir.
Derlenen bağlamalar, bağlama ifadelerini çalışma zamanı yerine derleme zamanında çözümleyerek uygulamalarda veri bağlama performansını Xamarin.Forms geliştirir. Ayrıca, bağlama ifadelerinin bu derleme zamanı doğrulaması, geçersiz bağlamalar derleme hataları olarak bildirildiği için daha iyi bir geliştirici sorun giderme deneyimi sağlar.
Derlenmiş bağlamaları kullanma işlemi şu şekildedir:
- XAML derlemesini etkinleştirin. XAML derlemesi hakkında daha fazla bilgi için bkz . XAML Derlemesi.
x:DataType
ve alt öğelerinin bağlanacağı nesneninVisualElement
türüne birVisualElement
özniteliği ayarlayın.
Not
özniteliğinin x:DataType
görünüm hiyerarşisinde BindingContext
ayarlandığı gibi aynı düzeyde ayarlanması önerilir. Ancak, bu öznitelik bir görünüm hiyerarşisindeki herhangi bir konumda yeniden tanımlanabilir.
Derlenmiş bağlamaları kullanmak için özniteliği bir x:DataType
dize değişmez değerine veya işaretleme uzantısını kullanan bir türe x:Type
ayarlanmalıdır. XAML derleme zamanında, geçersiz bağlama ifadeleri derleme hataları olarak bildirilir. Ancak, XAML derleyicisi yalnızca karşılaştığı ilk geçersiz bağlama ifadesi için bir derleme hatası bildirir. veya alt öğelerinde VisualElement
tanımlanan tüm geçerli bağlama ifadeleri, XAML'de veya kodda ayarlanmış olmasına BindingContext
bakılmaksızın derlenir. Bağlama ifadesi derlendiğinde, kaynaktaki bir özellikten bir değer alacak ve bunu işaretlemede belirtilen hedefteki özellikte ayarlayacak derlenmiş kod oluşturur. Ayrıca, bağlama ifadesine bağlı olarak, oluşturulan kod kaynak özelliğin değerindeki değişiklikleri gözlemleyebilir ve hedef özelliği yenileyebilir ve değişiklikleri hedeftenkaynağa geri gönderebilir.
Önemli
Derlenmiş bağlamalar şu anda özelliğini tanımlayan tüm bağlama ifadeleri için devre dışı bırakılmıştır Source
. Bunun nedeni, özelliğin Source
her zaman derleme zamanında çözümlenebilen işaretleme uzantısı kullanılarak x:Reference
ayarlanmasıdır.
Derlenmiş bağlamaları kullanma
Derlenmiş Renk Seçici sayfası, görünümler ve görünüm modeli özellikleri arasında Xamarin.Forms derlenmiş bağlamaların kullanılmasını gösterir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DataBindingDemos"
x:Class="DataBindingDemos.CompiledColorSelectorPage"
Title="Compiled Color Selector">
...
<StackLayout x:DataType="local:HslColorViewModel">
<StackLayout.BindingContext>
<local:HslColorViewModel Color="Sienna" />
</StackLayout.BindingContext>
<BoxView Color="{Binding Color}"
... />
<StackLayout Margin="10, 0">
<Label Text="{Binding Name}" />
<Slider Value="{Binding Hue}" />
<Label Text="{Binding Hue, StringFormat='Hue = {0:F2}'}" />
<Slider Value="{Binding Saturation}" />
<Label Text="{Binding Saturation, StringFormat='Saturation = {0:F2}'}" />
<Slider Value="{Binding Luminosity}" />
<Label Text="{Binding Luminosity, StringFormat='Luminosity = {0:F2}'}" />
</StackLayout>
</StackLayout>
</ContentPage>
Kök StackLayout
örneği HslColorViewModel
oluşturur ve özelliği için BindingContext
özellik öğesi etiketleri içinde özelliğini başlatırColor
. Bu kök StackLayout
ayrıca özniteliği viewmodel türü olarak tanımlar x:DataType
ve kök StackLayout
görünüm hiyerarşisindeki bağlama ifadelerinin derlendiğini belirtir. Bu, bağlama ifadelerinden herhangi biri var olmayan bir viewmodel özelliğine bağlanacak şekilde değiştirilerek doğrulanabilir ve bu da derleme hatasına neden olur. Bu örnek özniteliği bir dize değişmez değerine ayarlasa x:DataType
da, işaretleme uzantısına x:Type
sahip bir türe de ayarlanabilir. İşaretlemeyi genişletme hakkında x:Type
daha fazla bilgi için bkz . x:Type biçimlendirme uzantısı.
Önemli
x:DataType
Öznitelik, görünüm hiyerarşisindeki herhangi bir noktada yeniden tanımlanabilir.
BoxView
, Label
öğeleri ve Slider
görünümleri bağlama bağlamını StackLayout
öğesinden devralır. Bu görünümlerin tümü görünüm modelindeki kaynak özelliklere başvuran bağlama hedefleridir. BoxView.Color
özelliği ve Label.Text
özelliği için veri bağlamaları şunlardır OneWay
: görünümdeki özellikler görünüm modelindeki özelliklerden ayarlanır. Ancak özelliği Slider.Value
bir TwoWay
bağlama kullanır. Bu, her Slider
birinin görünüm modelinden ve ayrıca görünüm modellerinin her Slider
birinden ayarlanmasına olanak tanır.
Uygulama ilk kez çalıştırıldığında, , Label
öğeleri ve Slider
öğelerinin BoxView
tümü görünüm modeli örneği oluşturulurken ayarlanan ilk Color
özellik temelinde görünüm modelinden ayarlanır. Bu, aşağıdaki ekran görüntülerinde gösterilir:
Kaydırıcılar değiştirildiğinde BoxView
ve Label
öğeleri buna göre güncelleştirilir.
Bu renk seçici hakkında daha fazla bilgi için bkz . ViewModels ve Property-Change Notifications.
DataTemplate'da derlenmiş bağlamaları kullanma
içindeki DataTemplate
bağlamalar, şablonlanan nesne bağlamında yorumlanır. Bu nedenle, içinde DataTemplate
DataTemplate
derlenmiş bağlamaları kullanırken özniteliğini kullanarak veri nesnesinin türünü bildirmesi x:DataType
gerekir.
Derlenmiş Renk Listesi sayfası, içinde DataTemplate
derlenmiş bağlamaların kullanılmasını gösterir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DataBindingDemos"
x:Class="DataBindingDemos.CompiledColorListPage"
Title="Compiled Color List">
<Grid>
...
<ListView x:Name="colorListView"
ItemsSource="{x:Static local:NamedColor.All}"
... >
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:NamedColor">
<ViewCell>
<StackLayout Orientation="Horizontal">
<BoxView Color="{Binding Color}"
... />
<Label Text="{Binding FriendlyName}"
... />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<!-- The BoxView doesn't use compiled bindings -->
<BoxView Color="{Binding Source={x:Reference colorListView}, Path=SelectedItem.Color}"
... />
</Grid>
</ContentPage>
ListView.ItemsSource
özelliği statik NamedColor.All
özelliğe ayarlanır. sınıfı, NamedColor
yapıdaki Color
tüm statik ortak alanları listelemek ve statik özelliğinden erişilebilen bir koleksiyonda adlarıyla depolamak için .NET yansımasını All
kullanır. Bu nedenle, ListView
tüm NamedColor
örneklerle doldurulur. içindeki ListView
her öğe için öğenin bağlama bağlamı bir NamedColor
nesne olarak ayarlanır. BoxView
içindeki ViewCell
ve Label
öğeleri özelliklere NamedColor
bağlıdır.
özniteliğinin DataTemplate
x:DataType
türü olarak NamedColor
tanımlandığını ve görünüm hiyerarşisindeki DataTemplate
bağlama ifadelerinin derlendiğini unutmayın. Bu, bağlama ifadelerinden herhangi biri var NamedColor
olmayan bir özelliğe bağlanacak şekilde değiştirilerek doğrulanabilir ve bu da derleme hatasına neden olur. Bu örnek özniteliği bir dize değişmez değerine ayarlasa x:DataType
da, işaretleme uzantısına x:Type
sahip bir türe de ayarlanabilir. İşaretlemeyi genişletme hakkında x:Type
daha fazla bilgi için bkz . x:Type biçimlendirme uzantısı.
Uygulama ilk kez çalıştırıldığında, ListView
örneğiyle NamedColor
doldurulur. öğesindeki ListView
bir öğe seçildiğinde, BoxView.Color
özelliği içinde ListView
seçili öğenin rengine ayarlanır:
içindeki ListView
diğer öğelerin seçilmesi, öğesinin BoxView
rengini güncelleştirir.
Derlenmiş bağlamaları klasik bağlamalarla birleştirme
Bağlama ifadeleri yalnızca özniteliğin tanımlandığı görünüm hiyerarşisi x:DataType
için derlenir. Buna karşılık, özniteliğin x:DataType
tanımlanmadığı bir hiyerarşideki tüm görünümler klasik bağlamaları kullanır. Bu nedenle derlenmiş bağlamaları ve klasik bağlamaları bir sayfada birleştirmek mümkündür. Örneğin, önceki bölümde, içindeki görünümler DataTemplate
derlenmiş bağlamaları kullanırken BoxView
, içinde seçilen ListView
renge ayarlanmış görünümler kullanılmaz.
Bu nedenle özniteliklerin dikkatli bir şekilde yapılandırılması x:DataType
, derlenmiş ve klasik bağlamaların kullanıldığı bir sayfaya yol açabilir. Alternatif olarak, x:DataType
özniteliği, işaretleme uzantısını kullanmak x:Null
için null
görünüm hiyerarşisindeki herhangi bir noktada yeniden tanımlanabilir. Bunu yapmak, görünüm hiyerarşisi içindeki tüm bağlama ifadelerinin klasik bağlamaları kullanacağını gösterir. Karma Bağlamalar sayfasında şu yaklaşım gösterilir:
<StackLayout x:DataType="local:HslColorViewModel">
<StackLayout.BindingContext>
<local:HslColorViewModel Color="Sienna" />
</StackLayout.BindingContext>
<BoxView Color="{Binding Color}"
VerticalOptions="FillAndExpand" />
<StackLayout x:DataType="{x:Null}"
Margin="10, 0">
<Label Text="{Binding Name}" />
<Slider Value="{Binding Hue}" />
<Label Text="{Binding Hue, StringFormat='Hue = {0:F2}'}" />
<Slider Value="{Binding Saturation}" />
<Label Text="{Binding Saturation, StringFormat='Saturation = {0:F2}'}" />
<Slider Value="{Binding Luminosity}" />
<Label Text="{Binding Luminosity, StringFormat='Luminosity = {0:F2}'}" />
</StackLayout>
</StackLayout>
Kök StackLayout
, özniteliği türü x:DataType
HslColorViewModel
olarak ayarlar ve kök StackLayout
görünüm hiyerarşisindeki tüm bağlama ifadelerinin derlendiğini belirtir. Ancak, iç StackLayout
işaretleme ifadesi ile özniteliğini null
x:Null
yeniden tanımlarx:DataType
. Bu nedenle, iç StackLayout
içindeki bağlama ifadeleri klasik bağlamaları kullanır. BoxView
Yalnızca kök StackLayout
görünüm hiyerarşisi içindeki içindeki , derlenmiş bağlamaları kullanır.
İşaretleme ifadesi hakkında x:Null
daha fazla bilgi için bkz . x:Null İşaretleme Uzantısı.
Performans
Derlenen bağlamalar, performans avantajı farklılık göstererek veri bağlama performansını geliştirir. Birim testi şunları ortaya koyuyor:
- Özellik değiştirme bildirimi (örneğin
OneWay
, ,OneWayToSource
veyaTwoWay
bağlama) kullanan derlenmiş bağlama, klasik bağlamadan yaklaşık 8 kat daha hızlı çözümlenir. - Özellik değiştirme bildirimi (bağlama gibi) kullanmayan derlenmiş bağlama
OneTime
, klasik bağlamadan yaklaşık 20 kat daha hızlı çözümlenir. BindingContext
özellik değişiklik bildirimini (örneğin, ,OneWayToSource
veyaTwoWay
bağlamasıOneWay
) kullanan derlenmiş bağlamada ayarının ayarlanması, klasik bağlamada ayarındanBindingContext
yaklaşık 5 kat daha hızlıdır.BindingContext
Özellik değişikliği bildirimi kullanmayan derlenmiş bir bağlamada ayarının (bağlamaOneTime
gibi) ayarlanması, klasik bağlamanın ayarlanmasındanBindingContext
yaklaşık 7 kat daha hızlıdır.
Bu performans farklılıkları, kullanılan platforma, kullanılan işletim sisteminin sürümüne ve uygulamanın çalıştığı cihaza bağlı olarak mobil cihazlarda büyütülebilir.