Aracılığıyla paylaş


Derlenmiş bağlamalar

Örneğe göz atın. Ö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.

Önemli

NativeAOT uygulamalarında ve tam kırpma etkinleştirilmiş uygulamalarda dize tabanlı bağlamalar yerine derlenmiş bağlamalar gereklidir. Daha fazla bilgi için bkz . .NET MAUI uygulamasını ve Yerel AOT dağıtımını kırpma.

XAML'de derlenmiş bağlamalar

XAML'de derlenmiş bağlamaları kullanmak için, ve alt öğelerinin bağlanacağı nesnenin x:DataType türüne bir VisualElement özniteliği ayarlayınVisualElement. ö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.

Önemli

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.

XAML'de derlenmiş bağlamaları kullanmak için özniteliğin x:DataType bir dize değişmez değeri veya işaretleme uzantısı kullanılarak bir türe x:Type ayarlanması gerekir. 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, özelliğini tanımlayan Source tüm XAML 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, XAML'deki derlenmiş bağlamalar şu anda çoklu bağlamalarda desteklenmemektedir.

.NET MAUI varsayılan olarak derlenmiş bağlamaları kullanmayan XAML bağlamaları için derleme uyarıları üretmez. Ancak derleme özelliğini uygulamanızın proje dosyasında (*.csproj) olarak ayarlayarak $(MauiStrictXamlCompilation) derlenmiş bağlama uyarılarının oluşturulmasını true kabul edebilirsiniz:

<MauiStrictXamlCompilation>true</MauiStrictXamlCompilation>

.NET MAUI varsayılan olarak derlenmiş bağlamaları kullanmayan XAML bağlamaları için derleme uyarıları oluşturur.

XAML derlenmiş bağlama uyarıları hakkında daha fazla bilgi için bkz . XAML derlenmiş bağlama uyarıları.

XAML'de 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 HslColorViewModel özellik öğesi etiketleri içinde özelliğini başlatırColor.BindingContext 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, , BoxView öğeleri ve Label öğelerinin Slidertü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:

Derlenmiş renk seçici.

Bu renk seçici hakkında daha fazla bilgi için bkz . ViewModels ve property-change notifications.

DataTemplate'da XAML'de 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. Bunun yapılmaması, üst kapsamından DataTemplate bir yanlışın x:DataType devralmasına neden olabilir:

<ContentPage ...
             x:DataType="local:AnimalsPageViewModel">
    <!-- Binding to AnimalsPageViewModel.Animals -->
    <CollectionView ItemsSource="{Binding Animals}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <!-- incorrect: compiler thinks you want to bind to AnimalsPageViewModel.Name -->  
                <Label Text="{Binding Name}" />
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</ContentPage>

Aşağıdaki örnekte, üzerinde x:DataTypeayarının doğru şekilde ayarlanması DataTemplate gösterilmektedir:

<ContentPage ...
             x:DataType="local:AnimalsPageViewModel">
    <!-- Binding to AnimalsPageViewModel.Animals -->
    <CollectionView ItemsSource="{Binding Animals}">
        <CollectionView.ItemTemplate>
            <DataTemplate x:DataType="local:Animal">
                <!-- correct: compiler knows you want to bind to Animal.Name -->
                <Label Text="{Binding Name}" />
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</ContentPage>

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ı.

Genel bir tür belirten bağlantıları derle

Genel türler, genel kısıtlama parantez içinde ön ekli dize bağımsız değişkeni olarak belirtilerek x:DataType özniteliğiyle belirtilebilir:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyMauiApp"
             x:Class="MyMauiApp.MyPage"
             x:DataType="local:MyViewModel(x:Boolean)">
    ...
</ContentPage>

Birden fazla tür argümanı, önünde bir önek bulunan ve virgülle ayrılan dize argümanları olarak belirtilebilir.

<DataTemplate x:DataType="local:MyType(local:MyObject,x:Boolean)">
    ...
</DataTemplate>

XAML'deki genel değerler hakkında daha fazla bilgi için bkz. Generics.

Özelliğini tanımlayan Source derleme bağlamaları

.NET MAUI 9'undan önce, XAML derleyicisi özelliği yerine Sourceözelliğini tanımlayan BindingContext bağlamaların derlenmesini atlardı. .NET MAUI 9'dan bu bağlamalar, daha iyi çalışma zamanı performansından yararlanmak için derlenebilir. Ancak, mevcut uygulama kodunun bozulmasını önlemek için bu iyileştirme varsayılan olarak etkinleştirilmez. Bu iyileştirmeyi etkinleştirmek için uygulamanızın $(MauiEnableXamlCBindingWithSourceCompilation) proje dosyasında derleme özelliğini true olarak ayarlayın:

<MauiEnableXamlCBindingWithSourceCompilation>true</MauiEnableXamlCBindingWithSourceCompilation>

Ardından, tüm bağlamalarınıza doğru x:DataType not eklerinin ekli olduğundan ve üst kapsamlarından yanlış veri türlerini devralmadığından emin olun:

<HorizontalStackLayout BindingContext="{x:Reference slider}" x:DataType="Slider">
    <Label Text="{Binding Value}" />
    <Label Text="{Binding Text, Source={x:Reference entry}, x:DataType=Entry}" />
</HorizontalStackLayout>

Not

ile Sourcebir bağlamanın olduğu ancak öğesini üst öğeden devraldığı x:DataType durumlarda ve türü arasında x:DataType bir uyuşmazlık Sourceolabilir. Bu senaryoda bir uyarı oluşturulur ve çalışma zamanında bağlama yolunu çözümleyen yansıma tabanlı bağlamaya geri dönüş gerçekleşir.

Derlenmiş bağlamaları XAML'de 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 null için x: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 x:DataTypenull yeniden tanımlarx:Null. 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ı.

XAML derlenmiş bağlama uyarıları

Aşağıdaki tabloda derlenmiş bağlamalar için derleyici uyarıları ve bunların nasıl çözüleceğinin listesi yer alır:

Kod İleti Düzelt
XC0022 Bağlama, belirtilirse x:DataType çalışma zamanı performansını geliştirmek için derlenebilir. Geçerli x:DataTypetürünü belirtmek için XAML'nize ekleyinBindingContext. Bağlama bağlamı değişen tüm öğelere eklemek x:DataType en iyi yöntemdir.
XC0023 Bağlama, açıkça x:DataTypebelirtilmemişse null çalışma zamanı performansını geliştirmek için derlenebilir. değerini doğru türle değiştirin x:DataType="{x:Null}" .
Kod İleti
XC0022 Bağlama, belirtilirse x:DataType çalışma zamanı performansını geliştirmek için derlenebilir.

Bu uyarıyı düzeltmek için XAML'nize ekleyerek x:DataType geçerli BindingContexttürünün türünü belirtin. Bağlama bağlamı değişen tüm öğelere eklemek x:DataType en iyi yöntemdir.
XC0023 Bağlama, açıkça x:DataTypebelirtilmemişse null çalışma zamanı performansını geliştirmek için derlenebilir.

Bu uyarıyı düzeltmek için değerini doğru türle değiştirin x:DataType="{x:Null}" .
XC0024 Ek açıklama bir dış kapsamdan geldiğinden x:DataType bağlama yanlış derlenebilir. Tüm DataTemplate XAML öğelerine doğru x:DataTypenot eklediğinizden emin olun.

Bu uyarıyı düzeltmek için, tüm DataTemplate öğelerin doğru x:DataTypeile ek açıklamalı olduğundan emin olun.
XC0025 Bağlama, açıkça ayarlanmış Source bir özelliğe sahip olduğundan derlenmedi ve ile Source bağlamaların derlenmesi etkinleştirilmedi. Proje dosyanızda öğesini ayarlayarak bu iyileştirmeyi <MauiEnableXamlCBindingWithSourceCompilation>true</MauiEnableXamlCBindingWithSourceCompilation> etkinleştirmeyi göz önünde bulundurun ve bu bağlama için doğrunun x:DataType belirtildiğinden emin olun.

Bu uyarıyı $(MauiEnableXamlCBindingWithSourceCompilation) düzeltmek için proje dosyanızda derleme özelliğini etkinleştirin ve tüm bağlamalarınıza uygun x:DataTypeile ek açıklama ekleyin.

Bu uyarıların yoksayılmasını sağlamak için, derleme özelliğiyle $(WarningsAsErrors) belirli uyarıları derleme hataları olarak değiştirmeyi göz önünde bulundurun:

<WarningsAsErrors>$(WarningsAsErrors);XC0022;XC0023</WarningsAsErrors>

Bu uyarıları yoksaymak için derleme özelliğini belirli uyarı kodlarıyla kullanın $(NoWarn) :

<NoWarn>$(NoWarn);XC0022;XC0023</NoWarn>

Önemli

XC0022 ve XC0023 derleme özelliği olarak ayarlanmadığı sürece uyarılar her zaman gizlenecektir $(MauiStrictXamlCompilation)true.

Uygulamanızın $(TreatWarningsAsErrors) proje dosyasında derleme özelliğini true olarak ayarladıysanız ancak belirli XAML derleyici uyarılarını yoksaymak istiyorsanız, bu uyarıları susturmak için derleme özelliğini veya bazı belirli kodların $(NoWarn) önem derecesini azaltmak için derleme özelliğini kullanın$(WarningsNotAsErrors).

.NET MAUI varsayılan olarak derlenmiş bağlamaları kullanmayan XAML bağlamaları için derleme uyarıları oluşturur. Uygulamanızın proje dosyasında (*.csproj) ve $(MauiStrictXamlCompilation) derleme özelliklerini $(TreatWarningsAsErrors) ayarlayarak true hata olarak kabul edilen derlenmiş bağlama uyarılarını kabul edebilirsiniz:

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<MauiStrictXamlCompilation>true</MauiStrictXamlCompilation>

Not

Uygulamanızı tam kırpma veya NativeAOT kullanarak yayımlamadığınız sürece derleme özelliği $(MauiStrictXamlCompilation) varsayılan olarak false kullanılır.

Kodda derlenmiş bağlamalar

Kodda yazılan bağlamalar genellikle çalışma zamanında yansıma ile çözümlenen dize yollarını kullanır. Bununla birlikte, uzantı yönteminin SetBinding dize yolu yerine bağımsız Func değişken kullanarak bağlamaları tanımlayan bir aşırı yüklemesi de vardır:

MyLabel.SetBinding(Label.TextProperty, static (Entry entry) => entry.Text);

Derlenmiş bağlama tanımlamak için tüm yöntemler kullanılamaz. İfade basit bir özellik erişim ifadesi olmalıdır. Aşağıdaki örneklerde geçerli ve geçersiz bağlama ifadeleri gösterilmektedir:

// Valid: Property access
static (PersonViewModel vm) => vm.Name;
static (PersonViewModel vm) => vm.Address?.Street;

// Valid: Array and indexer access
static (PersonViewModel vm) => vm.PhoneNumbers[0];
static (PersonViewModel vm) => vm.Config["Font"];

// Valid: Casts
static (Label label) => (label.BindingContext as PersonViewModel).Name;
static (Label label) => ((PersonViewModel)label.BindingContext).Name;

// Invalid: Method calls
static (PersonViewModel vm) => vm.GetAddress();
static (PersonViewModel vm) => vm.Address?.ToString();

// Invalid: Complex expressions
static (PersonViewModel vm) => vm.Address?.Street + " " + vm.Address?.City;
static (PersonViewModel vm) => $"Name: {vm.Name}";

Uyarı

Bir özellik veya dizin oluşturucu için ayarlanan erişimci erişilemezse CS0272 derleyici hatası oluşur. Bu durumda erişimcinin erişilebilirliğini artırın.

Buna ek olarak, BindingBase.Create yöntemi bağlamayı doğrudan ile Funcnesnesi üzerinde ayarlar ve bağlama nesnesi örneğini döndürür:

myEntry.SetBinding(Entry.TextProperty, new MultiBinding
{
    Bindings = new Collection<BindingBase>
    {
        Binding.Create(static (Entry entry) => entry.FontFamily, source: RelativeBindingSource.Self),
        Binding.Create(static (Entry entry) => entry.FontSize, source: RelativeBindingSource.Self),
        Binding.Create(static (Entry entry) => entry.FontAttributes, source: RelativeBindingSource.Self),
    },
    Converter = new StringConcatenationConverter()
});

Bu derlenmiş bağlama yaklaşımları aşağıdaki avantajları sağlar:

  • Bağlama ifadelerini çalışma zamanı yerine derleme zamanında çözümleyerek veri bağlama performansı iyileştirildi.
  • Geçersiz bağlamalar derleme hataları olarak bildirildiği için daha iyi bir geliştirici sorun giderme deneyimi.
  • Düzenlerken IntelliSense.

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, , OneWayveya OneWayToSource bağlamasıTwoWay) 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.