Derlenmiş bağlamalar
.NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) 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 .NET MAUI uygulamalarında veri bağlama performansını 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ı kullanmak için, ve alt öğelerinin bağlanacağı nesnenin VisualElement türüne bir VisualElement özniteliği ayarlayınx:DataType
. ö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.
Dekont
Derlenen bağlamalar, .NET MAUI'de varsayılan olarak etkinleştirilen XAML derlemesinin kullanılmasını gerektirir. XAML derlemesini devre dışı bırakmışsanız etkinleştirmeniz gerekir. Daha fazla bilgi için bkz . XAML Derlemesi.
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
Derlenen bağlamalar, özelliğini tanımlayan Source
tüm bağlama ifadeleri için devre dışı bırakılır. Bunun nedeni, özelliğin Source
her zaman derleme zamanında çözümlenebilen işaretleme uzantısı kullanılarak x:Reference
ayarlanmasıdır.
Ayrıca, derlenmiş bağlamalar şu anda çoklu bağlamalarda desteklenmiyor.
Derlenmiş bağlamaları kullanma
Aşağıdaki örnekte.NET MAUI görünümleri ve görünüm modeli özellikleri arasında derlenmiş bağlamaların kullanılması gösterilmektedir:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DataBindingDemos"
x:Class="DataBindingDemos.CompiledColorSelectorPage"
x:DataType="local:HslColorViewModel"
Title="Compiled Color Selector">
<ContentPage.BindingContext>
<local:HslColorViewModel Color="Sienna" />
</ContentPage.BindingContext>
...
<StackLayout>
<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>
örneği ContentPage oluşturur ve özelliği için BindingContext
özellik öğesi etiketleri içinde özelliğini başlatırColor
.HslColorViewModel
ayrıca ContentPage özniteliğini x:DataType
viewmodel türü olarak tanımlar ve görünüm hiyerarşisindeki ContentPage tüm 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ı ContentPageöğ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 Sliderbirinden ayarlanmasına olanak tanır.
Örnek ilk kez çalıştırıldığında, , Label öğeleri ve Slider öğelerinin BoxViewtümü görünüm modeli örneği oluşturulurken ayarlanan ilk Color
özellik temelinde görünüm modelinden ayarlanır. 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 DataTemplateDataTemplate derlenmiş bağlamaları kullanırken özniteliğini kullanarak veri nesnesinin türünü bildirmesi x:DataType
gerekir.
Aşağıdaki örnekte, içinde DataTemplatederlenmiş bağlamaların kullanılması gösterilmektedir:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
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ı, sınıfındaki NamedColor
tüm statik ortak alanları Colors 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 ListViewher öğ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ğini DataTemplatex:DataType
türü olarak NamedColor
tanımlar ve görünüm hiyerarşisindeki DataTemplate bağlama ifadelerinin derlendiğini belirtir. 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ı.
Örnek ilk kez çalıştırıldığında, ListView örneği örneklerle NamedColor
doldurulur. öğesindeki ListView bir öğe seçildiğinde, BoxView.Color
özelliği içinde ListViewseçili öğenin rengine ayarlanır:
içindeki ListView diğer öğelerin seçilmesi, öğesinin BoxViewrengini 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. Aşağıdaki örnekte bu yaklaşım gösterilmektedir:
<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. BoxViewYalnı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:
- Ö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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin