Derlenmiş bağlamalar

Browse sample. Örneğe göz atın

.NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) veri bağlamalarının iki ana sorunu vardır:

  1. 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.
  2. 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:

Compiled color selector.

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:

Compiled color list.

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:DataTypeHslColorViewModel 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 nullx: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, , OneWayToSourceveya TwoWay 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, , OneWayToSourceveya TwoWay bağlamasıOneWay) kullanan derlenmiş bağlamada ayarının ayarlanması, klasik bağlamada ayarından BindingContext 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ğlama OneTime gibi) ayarlanması, klasik bağlamanın ayarlanmasından BindingContext 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.