Bagikan melalui


Pengikatan yang dikompilasi

Browse sample. Telusuri sampel

Pengikatan data .NET Multi-platform App UI (.NET MAUI) memiliki dua masalah utama:

  1. Tidak ada validasi ekspresi pengikatan waktu kompilasi. Sebaliknya, pengikatan diselesaikan pada runtime. Oleh karena itu, pengikatan yang tidak valid tidak terdeteksi hingga runtime ketika aplikasi tidak berperilaku seperti yang diharapkan atau pesan kesalahan muncul.
  2. Biayanya tidak hemat biaya. Pengikatan diselesaikan pada runtime menggunakan inspeksi objek tujuan umum (refleksi), dan overhead melakukan ini bervariasi dari platform ke platform.

Pengikatan yang dikompilasi meningkatkan performa pengikatan data dalam aplikasi .NET MAUI dengan menyelesaikan ekspresi pengikatan pada waktu kompilasi daripada runtime. Selain itu, validasi ekspresi pengikatan waktu kompilasi ini memungkinkan pengalaman pemecahan masalah pengembang yang lebih baik karena pengikatan yang tidak valid dilaporkan sebagai kesalahan build.

Untuk menggunakan pengikatan yang dikompilasi, atur x:DataType atribut pada VisualElement ke jenis objek yang akan diikat VisualElement dan anak-anaknya. Disarankan untuk mengatur x:DataType atribut pada tingkat yang sama dalam hierarki tampilan saat BindingContext diatur. Namun, atribut ini dapat ditentukan ulang di lokasi mana pun dalam hierarki tampilan.

Catatan

Pengikatan yang dikompilasi memerlukan penggunaan kompilasi XAML, yang diaktifkan secara default di .NET MAUI. Jika Anda telah menonaktifkan kompilasi XAML, Anda harus mengaktifkannya. Untuk informasi selengkapnya, lihat Kompilasi XAML.

Untuk menggunakan pengikatan yang dikompilasi, x:DataType atribut harus diatur ke string literal, atau jenis menggunakan x:Type ekstensi markup. Pada waktu kompilasi XAML, ekspresi pengikatan yang tidak valid akan dilaporkan sebagai kesalahan build. Namun, pengkompilasi XAML hanya akan melaporkan kesalahan build untuk ekspresi pengikatan pertama yang tidak valid yang ditemuinya. Setiap ekspresi pengikatan valid yang ditentukan pada VisualElement atau turunannya akan dikompilasi, terlepas dari apakah BindingContext diatur dalam XAML atau kode. Mengkompilasi ekspresi pengikatan menghasilkan kode yang dikompilasi yang akan mendapatkan nilai dari properti pada sumbernya, dan mengaturnya pada properti pada target yang ditentukan dalam markup. Selain itu, tergantung pada ekspresi pengikatan, kode yang dihasilkan dapat mengamati perubahan nilai properti sumber dan merefresh properti target , dan dapat mendorong perubahan dari target kembali ke sumber.

Penting

Pengikatan yang dikompilasi dinonaktifkan untuk ekspresi pengikatan apa pun yang menentukan Source properti . Ini karena Source properti selalu diatur menggunakan x:Reference ekstensi markup, yang tidak dapat diselesaikan pada waktu kompilasi.

Selain itu, pengikatan yang dikompilasi saat ini tidak didukung pada multi-pengikatan.

Menggunakan pengikatan yang dikompilasi

Contoh berikut menunjukkan menggunakan pengikatan yang dikompilasi antara tampilan .NET MAUI dan properti viewmodel:

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

Membuat ContentPage instans HslColorViewModelColor dan menginisialisasi properti dalam tag elemen properti untuk BindingContext properti . juga ContentPage mendefinisikan x:DataType atribut sebagai jenis viewmodel, menunjukkan bahwa ekspresi pengikatan apa pun dalam ContentPage hierarki tampilan akan dikompilasi. Ini dapat diverifikasi dengan mengubah ekspresi pengikatan apa pun untuk mengikat properti viewmodel yang tidak ada, yang akan mengakibatkan kesalahan build. Meskipun contoh ini mengatur x:DataType atribut ke string literal, contoh ini juga dapat diatur ke jenis dengan x:Type ekstensi markup. Untuk informasi selengkapnya tentang x:Type ekstensi markup, lihat x:Type Markup Extension.

Penting

Atribut x:DataType dapat ditentukan ulang kapan saja dalam hierarki tampilan.

Elemen BoxView, Label dan Slider tampilan mewarisi konteks pengikatan dari ContentPage. Tampilan ini adalah semua target pengikatan yang mereferensikan properti sumber di viewmodel. BoxView.Color Untuk properti , dan Label.Text properti , pengikatan data adalah OneWay - properti dalam tampilan diatur dari properti di viewmodel. Namun, Slider.Value properti menggunakan pengikatan TwoWay . Ini memungkinkan masing-masing Slider diatur dari viewmodel, dan juga agar viewmodel diatur dari masing-masing Slider.

Ketika contoh pertama kali dijalankan, BoxViewelemen , Label dan Slider elemen semuanya diatur dari viewmodel berdasarkan properti awal Color yang ditetapkan ketika viewmodel dibuat. Saat slider dimanipulasi, elemen dan Label diperbarui BoxView dengan sesuai:

Compiled color selector.

Untuk informasi selengkapnya tentang pemilih warna ini, lihat ViewModels dan pemberitahuan perubahan properti.

Menggunakan pengikatan yang dikompilasi dalam DataTemplate

Pengikatan dalam ditafsirkan DataTemplate dalam konteks objek yang di-template. Oleh karena itu, saat menggunakan pengikatan yang dikompilasi dalam DataTemplate, DataTemplate kebutuhan untuk mendeklarasikan jenis objek datanya menggunakan x:DataType atribut .

Contoh berikut menunjukkan penggunaan pengikatan yang dikompilasi dalam DataTemplate:

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

Properti ListView.ItemsSource diatur ke properti statis NamedColor.All . Kelas menggunakan NamedColor refleksi .NET untuk menghitung semua bidang publik statis di Colors kelas, dan untuk menyimpannya dengan namanya dalam koleksi yang dapat diakses dari properti statis All . Oleh karena itu, ListView diisi dengan semua NamedColor instans. Untuk setiap item dalam ListViewkonteks pengikatan untuk item diatur ke NamedColor objek. Elemen BoxView dan Label dalam ViewCell terikat ke NamedColor properti.

DataTemplate mendefinisikan x:DataType atribut menjadi NamedColor jenis, menunjukkan bahwa ekspresi pengikatan apa pun dalam DataTemplate hierarki tampilan akan dikompilasi. Ini dapat diverifikasi dengan mengubah salah satu ekspresi pengikatan untuk mengikat ke properti yang tidak ada NamedColor , yang akan mengakibatkan kesalahan build. Meskipun contoh ini mengatur x:DataType atribut ke string literal, contoh ini juga dapat diatur ke jenis dengan x:Type ekstensi markup. Untuk informasi selengkapnya tentang x:Type ekstensi markup, lihat x:Type Markup Extension.

Ketika contoh pertama kali dijalankan, diisi ListView dengan NamedColor instans. Saat item dalam ListView dipilih, BoxView.Color properti diatur ke warna item yang dipilih di ListView:

Compiled color list.

Memilih item lain dalam ListView memperbarui warna BoxView.

Menggabungkan pengikatan yang dikompilasi dengan pengikatan klasik

Ekspresi pengikatan hanya dikompilasi untuk hierarki tampilan tempat x:DataType atribut ditentukan. Sebaliknya, setiap tampilan dalam hierarki di mana x:DataType atribut tidak ditentukan akan menggunakan pengikatan klasik. Oleh karena itu dimungkinkan untuk menggabungkan pengikatan yang dikompilasi dan pengikatan klasik pada halaman. Misalnya, di bagian sebelumnya tampilan dalam DataTemplate penggunaan pengikatan yang dikompilasi, sementara BoxView yang diatur ke warna yang dipilih di ListView tidak.

Oleh karena itu, penataan x:DataType atribut yang cermat dapat mengarah ke halaman menggunakan pengikatan kompilasi dan klasik. Atau, x:DataType atribut dapat didefinisikan kembali pada titik mana pun dalam hierarki tampilan untuk null menggunakan x:Null ekstensi markup. Melakukan ini menunjukkan bahwa setiap ekspresi pengikatan dalam hierarki tampilan akan menggunakan pengikatan klasik. Contoh berikut menunjukkan pendekatan ini:

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

Akar StackLayout mengatur x:DataType atribut menjadi HslColorViewModel jenis, menunjukkan bahwa ekspresi pengikatan apa pun dalam hierarki tampilan akar StackLayout akan dikompilasi. Namun, bagian dalam StackLayout menentukan ulang x:DataType atribut dengan nullx:Null ekspresi markup. Oleh karena itu, ekspresi pengikatan dalam bagian dalam StackLayout menggunakan pengikatan klasik. BoxViewHanya , dalam hierarki tampilan akarStackLayout, menggunakan pengikatan yang dikompilasi.

Untuk informasi selengkapnya tentang x:Null ekspresi markup, lihat x:Null Markup Extension.

Performa

Pengikatan yang dikompilasi meningkatkan performa pengikatan data, dengan manfaat performa bervariasi:

  • Pengikatan terkompilasi yang menggunakan pemberitahuan perubahan properti (yaitu OneWay, , OneWayToSourceatau TwoWay pengikatan) diselesaikan sekitar 8 kali lebih cepat daripada pengikatan klasik.
  • Pengikatan terkompilasi yang tidak menggunakan pemberitahuan perubahan properti (yaitu OneTime pengikatan) diselesaikan sekitar 20 kali lebih cepat daripada pengikatan klasik.
  • BindingContext Mengatur pada pengikatan terkompilasi yang menggunakan pemberitahuan perubahan properti (yaitu OneWay, , OneWayToSourceatau TwoWay pengikatan) sekitar 5 kali lebih cepat daripada mengatur BindingContext pada pengikatan klasik.
  • BindingContext Mengatur pada pengikatan terkompilasi yang tidak menggunakan pemberitahuan perubahan properti (yaitu OneTime pengikatan) sekitar 7 kali lebih cepat daripada mengatur BindingContext pada pengikatan klasik.

Perbedaan performa ini dapat diperbesar pada perangkat seluler, tergantung pada platform yang digunakan, versi sistem operasi yang digunakan, dan perangkat tempat aplikasi berjalan.