Ekstensi markup {x:Bind}

Catatan Untuk informasi umum tentang menggunakan pengikatan data di aplikasi Anda dengan {x:Bind} (dan untuk perbandingan all-up antara {x:Bind} dan {Binding}), lihat Pengikatan data secara mendalam.

Ekstensi markup {x:Bind} —baru untuk Windows 10—adalah alternatif untuk {Binding}. {x:Bind} berjalan dalam waktu yang lebih singkat dan lebih sedikit memori daripada {Binding} dan mendukung penelusuran kesalahan yang lebih baik.

Pada waktu kompilasi XAML, {x:Bind} dikonversi menjadi kode yang akan mendapatkan nilai dari properti pada sumber data, dan mengaturnya pada properti yang ditentukan dalam markup. Objek pengikatan dapat dikonfigurasi secara opsional untuk mengamati perubahan nilai properti sumber data dan merefresh dirinya sendiri berdasarkan perubahan tersebut (Mode="OneWay"). Ini juga dapat dikonfigurasi secara opsional untuk mendorong perubahan dalam nilainya sendiri kembali ke properti sumber (Mode="TwoWay").

Objek pengikatan yang dibuat oleh {x:Bind} dan {Binding} sebagian besar setara secara fungsional. Tetapi {x:Bind} menjalankan kode tujuan khusus, yang dihasilkannya pada waktu kompilasi, dan {Binding} menggunakan pemeriksaan objek runtime tujuan umum. Akibatnya, pengikatan {x:Bind} (sering disebut sebagai pengikatan terkompilasi) memiliki performa yang bagus, memberikan validasi waktu kompilasi ekspresi pengikatan Anda, dan mendukung penelusuran kesalahan dengan memungkinkan Anda mengatur titik henti dalam file kode yang dihasilkan sebagai kelas parsial untuk halaman Anda. File-file ini dapat ditemukan di folder Anda obj , dengan nama seperti (untuk C#) <view name>.g.cs.

Tip

{x:Bind} memiliki mode default OneTime, tidak seperti {Binding}, yang memiliki mode default OneWay. Ini dipilih karena alasan performa, karena menggunakan OneWay menyebabkan lebih banyak kode dihasilkan untuk menghubungkan dan menangani deteksi perubahan. Anda dapat secara eksplisit menentukan mode untuk menggunakan pengikatan OneWay atau TwoWay. Anda juga dapat menggunakan x:DefaultBindMode untuk mengubah mode default untuk {x:Bind} untuk segmen tertentu dari pohon markup. Mode yang ditentukan berlaku untuk ekspresi {x:Bind} apa pun pada elemen tersebut dan turunannya, yang tidak secara eksplisit menentukan mode sebagai bagian dari pengikatan.

Contoh aplikasi yang menunjukkan {x:Bind}

Penggunaan atribut XAML

<object property="{x:Bind}" .../>
-or-
<object property="{x:Bind propertyPath}" .../>
-or-
<object property="{x:Bind bindingProperties}" .../>
-or-
<object property="{x:Bind propertyPath, bindingProperties}" .../>
-or-
<object property="{x:Bind pathToFunction.functionName(functionParameter1, functionParameter2, ...), bindingProperties}" .../>
Istilah Deskripsi
propertyPath String yang menentukan jalur properti untuk pengikatan. Info lebih lanjut ada di bagian Jalur properti di bawah ini.
bindingProperties
propName=value[, propName=value]* Satu atau beberapa properti pengikatan yang ditentukan menggunakan sintaks pasangan nama/nilai.
propName Nama string properti yang akan diatur pada objek pengikatan. Misalnya, "Pengonversi".
nilai Nilai untuk mengatur properti ke. Sintaks argumen tergantung pada properti yang diatur. Berikut adalah contoh penggunaannilaipropName= di mana nilai itu sendiri adalah ekstensi markup: Converter={StaticResource myConverterClass}. Untuk informasi selengkapnya, lihat Bagian properti yang bisa Anda atur dengan {x:Bind} di bawah ini.

Contoh

<Page x:Class="QuizGame.View.HostView" ... >
    <Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
</Page>

Contoh XAML ini menggunakan {x:Bind} dengan properti ListView.ItemTemplate . Perhatikan deklarasi nilai x:DataType .

  <DataTemplate x:Key="SimpleItemTemplate" x:DataType="data:SampleDataGroup">
    <StackPanel Orientation="Vertical" Height="50">
      <TextBlock Text="{x:Bind Title}"/>
      <TextBlock Text="{x:Bind Description}"/>
    </StackPanel>
  </DataTemplate>

Jalur properti

PropertyPath menetapkan Jalur untuk ekspresi {x:Bind }. Jalur adalah jalur properti yang menentukan nilai properti, sub-properti, bidang, atau metode yang Anda ikat (sumbernya). Anda dapat menyebutkan nama properti Jalur secara eksplisit: {x:Bind Path=...}. Atau Anda dapat menghilangkannya: {x:Bind ...}.

Resolusi jalur properti

{x:Bind} tidak menggunakan DataContext sebagai sumber default—sebaliknya, ia menggunakan halaman atau kontrol pengguna itu sendiri. Jadi, ini akan melihat kode di belakang halaman atau kontrol pengguna Anda untuk properti, bidang, dan metode. Untuk mengekspos model tampilan Anda ke {x:Bind}, Anda biasanya ingin menambahkan bidang atau properti baru ke kode di belakang untuk halaman atau kontrol pengguna Anda. Langkah-langkah dalam jalur properti dibatasi oleh titik (.), dan Anda dapat menyertakan beberapa pemisah untuk melintasi sub-properti berturut-turut. Gunakan pemisah titik terlepas dari bahasa pemrograman yang digunakan untuk mengimplementasikan objek yang terikat.

Misalnya: di halaman, Text="{x:Bind Employee.FirstName}" akan mencari anggota Karyawan di halaman lalu anggota FirstName pada objek yang dikembalikan oleh Karyawan. Jika Anda mengikat kontrol item ke properti yang berisi dependen karyawan, jalur properti Anda mungkin "Employee.Dependents", dan templat item kontrol item akan mengurus menampilkan item di "Dependen".

Untuk C++/CX, {x:Bind} tidak dapat mengikat bidang dan properti privat di halaman atau model data – Anda harus memiliki properti publik agar dapat diikat. Area permukaan untuk pengikatan perlu diekspos sebagai kelas/antarmuka CX sehingga kita bisa mendapatkan metadata yang relevan. Atribut [Bindable] seharusnya tidak diperlukan.

Dengan x:Bind, Anda tidak perlu menggunakan ElementName=xxx sebagai bagian dari ekspresi pengikatan. Sebagai gantinya, Anda dapat menggunakan nama elemen sebagai bagian pertama dari jalur untuk pengikatan karena elemen bernama menjadi bidang dalam halaman atau kontrol pengguna yang mewakili sumber pengikatan akar.

Koleksi

Jika sumber data adalah koleksi, jalur properti dapat menentukan item dalam koleksi berdasarkan posisi atau indeksnya. Misalnya, "Teams[0]. Pemutar", di mana harfiah "[]" menyertakan "0" yang meminta item pertama dalam koleksi yang diindeks nol.

Untuk menggunakan pengindeks, model perlu menerapkan IList<T> atau IVector<T> pada jenis properti yang akan diindeks. (Perhatikan bahwa IReadOnlyList<T> dan IVectorView<T> tidak mendukung sintaks pengindeks.) Jika jenis properti terindeks mendukung INotifyCollectionChanged atau IObservableVector dan pengikatannya adalah OneWay atau TwoWay, maka ia akan mendaftar dan mendengarkan pemberitahuan perubahan pada antarmuka tersebut. Logika deteksi perubahan akan diperbarui berdasarkan semua perubahan koleksi, meskipun itu tidak memengaruhi nilai terindeks tertentu. Ini karena logika mendengarkan umum di semua instans koleksi.

Jika sumber data adalah Kamus atau Peta, jalur properti dapat menentukan item dalam koleksi dengan nama stringnya. Misalnya <TextBlock Text="{x:Bind Players['John Smith']}" /> akan mencari item dalam kamus bernama "John Smith". Nama perlu diapit dalam tanda kutip, dan tanda kutip tunggal atau ganda dapat digunakan. Topi (^) dapat digunakan untuk menghindari tanda kutip dalam string. Biasanya paling mudah untuk menggunakan kutipan alternatif dari yang digunakan untuk atribut XAML. (Perhatikan bahwa IReadOnlyDictionary<T> dan IMapView<T> tidak mendukung sintaks pengindeks.)

Untuk menggunakan pengindeks string, model perlu menerapkan string IDictionary<, string T> atau IMap<, T> pada jenis properti yang akan diindeks. Jika jenis properti terindeks mendukung IObservableMap dan pengikatannya adalah OneWay atau TwoWay, maka ia akan mendaftar dan mendengarkan pemberitahuan perubahan pada antarmuka tersebut. Logika deteksi perubahan akan diperbarui berdasarkan semua perubahan koleksi, meskipun itu tidak memengaruhi nilai terindeks tertentu. Ini karena logika mendengarkan umum di semua instans koleksi.

Properti yang Terlampir

Untuk mengikat properti terlampir, Anda perlu memasukkan nama kelas dan properti ke dalam tanda kurung setelah titik. Misalnya Text="{x:Bind Button22.( Grid.Row)}". Jika properti tidak dideklarasikan dalam namespace Xaml, maka Anda harus mengawalinya dengan namespace xml, yang harus Anda petakan ke namespace kode di kepala dokumen.

Casting

Pengikatan yang dikompilasi diketik dengan kuat, dan akan menyelesaikan jenis setiap langkah dalam jalur. Jika jenis yang dikembalikan tidak memiliki anggota, jenis tersebut akan gagal pada waktu kompilasi. Anda dapat menentukan transmisi untuk memberi tahu pengikatan jenis objek yang sebenarnya.

Dalam kasus berikut, obj adalah properti dari objek jenis, tetapi berisi kotak teks, sehingga kita dapat menggunakan Text="{x:Bind ((TextBox)obj). Text}" atau Text="{x:Bind obj.(TextBox.Text)}".

Bidang groups3 di Text="{x:Bind ((data:SampleDataGroup)groups3[0]). Title}" adalah kamus objek, jadi Anda harus mentransmisikannya ke data:SampleDataGroup. Perhatikan penggunaan data xml: awalan namespace untuk memetakan jenis objek ke namespace kode yang bukan bagian dari namespace XAML default.

Catatan: Sintaks cast C#-style lebih fleksibel daripada sintaks properti yang terpasang, dan merupakan sintaks yang direkomendasikan ke depannya.

Transmisi tanpa jalur

Parser ikatan asli tidak menyediakan kata kunci untuk diwakili this sebagai parameter fungsi, tetapi mendukung pengecoran tanpa jalur (misalnya, {x:Bind (x:String)}), yang dapat digunakan sebagai parameter fungsi. Oleh karena itu, {x:Bind MethodName((namespace:TypeOfThis))} adalah cara yang valid untuk melakukan apa yang secara konseptual setara {x:Bind MethodName(this)}dengan .

Contoh:

Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}"

<Page
    x:Class="AppSample.MainPage"
    ...
    xmlns:local="using:AppSample">

    <Grid>
        <ListView ItemsSource="{x:Bind Songs}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:SongItem">
                    <TextBlock
                        Margin="12"
                        FontSize="40"
                        Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>
namespace AppSample
{
    public class SongItem
    {
        public string TrackName { get; private set; }
        public string ArtistName { get; private set; }

        public SongItem(string trackName, string artistName)
        {
            ArtistName = artistName;
            TrackName = trackName;
        }
    }

    public sealed partial class MainPage : Page
    {
        public List<SongItem> Songs { get; }
        public MainPage()
        {
            Songs = new List<SongItem>()
            {
                new SongItem("Track 1", "Artist 1"),
                new SongItem("Track 2", "Artist 2"),
                new SongItem("Track 3", "Artist 3")
            };

            this.InitializeComponent();
        }

        public static string GenerateSongTitle(SongItem song)
        {
            return $"{song.TrackName} - {song.ArtistName}";
        }
    }
}

Fungsi dalam jalur pengikatan

Mulai Windows 10, versi 1607, {x:Bind} mendukung penggunaan fungsi sebagai langkah daun dari jalur pengikatan. Ini adalah fitur canggih untuk databinding yang memungkinkan beberapa skenario dalam markup. Lihat pengikatan fungsi untuk detailnya.

Pengikatan Peristiwa

Pengikatan peristiwa adalah fitur unik untuk pengikatan yang dikompilasi. Ini memungkinkan Anda menentukan handler untuk peristiwa menggunakan pengikatan, daripada harus menjadi metode pada kode di belakang. Misalnya: Click="{x:Bind rootFrame.GoForward}".

Untuk peristiwa, metode target tidak boleh kelebihan beban dan juga harus:

  • Cocokkan tanda tangan acara.
  • ATAU tidak memiliki parameter.
  • ATAU memiliki jumlah parameter jenis yang sama yang dapat ditetapkan dari jenis parameter peristiwa.

Dalam kode-belakang yang dihasilkan, pengikatan yang dikompilasi menangani peristiwa dan merutekannya ke metode pada model, mengevaluasi jalur ekspresi pengikatan saat peristiwa terjadi. Ini berarti bahwa, tidak seperti pengikatan properti, itu tidak melacak perubahan pada model.

Untuk informasi selengkapnya tentang sintaks string untuk jalur properti, lihat Sintaks jalur properti, mengingat perbedaan yang dijelaskan di sini untuk {x:Bind}.

Properti yang bisa Anda atur dengan {x:Bind}

{x:Bind} diilustrasikan dengan sintaks tempat penampung bindingProperties karena ada beberapa properti baca/tulis yang dapat diatur dalam ekstensi markup. Properti dapat diatur dalam urutan apa pun dengan pasangannilaipropName= yang dipisahkan koma. Perhatikan bahwa Anda tidak dapat menyertakan hentian baris dalam ekspresi pengikatan. Beberapa properti memerlukan tipe yang tidak memiliki konversi tipe, jadi ini memerlukan ekstensi markup dari properti mereka sendiri yang ditumpuk dalam {x:Bind}.

Properti ini bekerja dengan cara yang sama seperti properti kelas Pengikatan .

Properti Deskripsi
Jalur Lihat bagian Jalur properti di atas.
Converter Menentukan objek konverter yang dipanggil oleh mesin pengikatan. Pengonversi dapat diatur dalam XAML, tetapi hanya jika Anda merujuk ke instans objek yang telah Anda tetapkan dalam referensi ekstensi markup {StaticResource} ke objek tersebut dalam kamus sumber daya.
ConverterLanguage Menentukan budaya yang akan digunakan oleh pengonversi. (Jika Anda mengatur ConverterLanguage , Anda juga harus mengatur Converter.) Budaya ditetapkan sebagai pengidentifikasi berbasis standar. Untuk informasi selengkapnya, lihat ConverterLanguage.
ConverterParameter Menentukan parameter konverter yang dapat digunakan dalam logika konverter. (Jika Anda mengatur ConverterParameter , Anda juga harus mengatur Converter.) Sebagian besar konverter menggunakan logika sederhana yang mendapatkan semua info yang mereka butuhkan dari nilai yang diteruskan untuk dikonversi, dan tidak memerlukan nilai ConverterParameter . Parameter ConverterParameter adalah untuk implementasi konverter yang cukup canggih yang memiliki lebih dari satu logika yang mematikan apa yang diteruskan di ConverterParameter. Anda dapat menulis pengonversi yang menggunakan nilai selain string tetapi ini jarang terjadi, lihat Keterangan di ConverterParameter untuk informasi selengkapnya.
FallbackValue Menentukan nilai yang akan ditampilkan ketika sumber atau jalur tidak dapat diselesaikan.
Mode Menentukan mode pengikatan, sebagai salah satu string ini: "OneTime", "OneWay", atau "TwoWay". Defaultnya adalah "OneTime". Perhatikan bahwa ini berbeda dari default untuk {Binding}, yaitu "OneWay" dalam banyak kasus.
TargetNullValue Menentukan nilai yang akan ditampilkan saat nilai sumber diselesaikan tetapi secara eksplisit null.
BindBack Menentukan fungsi yang akan digunakan untuk arah terbalik pengikatan dua arah.
UpdateSourceTrigger Menentukan kapan harus mendorong perubahan kembali dari kontrol ke model dalam pengikatan TwoWay. Default untuk semua properti kecuali TextBox.Text adalah PropertyChanged; TextBox.Text adalah LostFocus.

Catatan

Jika Anda mengonversi markup dari {Binding} ke {x:Bind}, maka ketahui perbedaan nilai default untuk properti Mode . x:DefaultBindMode dapat digunakan untuk mengubah mode default untuk x:Bind untuk segmen tertentu dari pohon markup. Mode yang dipilih akan menerapkan ekspresi x:Bind apa pun pada elemen tersebut dan turunannya, yang tidak secara eksplisit menentukan mode sebagai bagian dari pengikatan. OneTime lebih berkinerja daripada OneWay karena menggunakan OneWay akan menyebabkan lebih banyak kode dihasilkan untuk menghubungkan dan menangani deteksi perubahan.

Keterangan

Karena {x:Bind} menggunakan kode yang dihasilkan untuk mencapai manfaatnya, diperlukan informasi jenis pada waktu kompilasi. Ini berarti Anda tidak dapat mengikat properti di mana Anda tidak tahu jenis sebelumnya. Karena itu, Anda tidak dapat menggunakan {x:Bind} dengan properti DataContext , yang berjenis Objek, dan juga dapat berubah pada durasi.

Saat menggunakan {x:Bind} dengan templat data, Anda harus menunjukkan jenis yang terikat dengan mengatur nilai x:DataType , seperti yang ditunjukkan di bagian Contoh . Anda juga dapat mengatur jenis ke antarmuka atau jenis kelas dasar, lalu menggunakan transmisi jika perlu untuk merumuskan ekspresi lengkap.

Pengikatan yang dikompilasi bergantung pada pembuatan kode. Jadi, jika Anda menggunakan {x:Bind} dalam kamus sumber daya, maka kamus sumber daya harus memiliki kelas code-behind. Lihat Kamus sumber daya dengan {x:Bind} untuk contoh kode.

Halaman dan kontrol pengguna yang menyertakan Pengikatan terkompilasi akan memiliki properti "Pengikatan" dalam kode yang dihasilkan. Ini termasuk metode berikut:

  • Update() - Ini akan memperbarui nilai semua pengikatan yang dikompilasi. Setiap pengikatan satu arah/Dua Arah akan membuat pendengar terhubung untuk mendeteksi perubahan.
  • Initialize() - Jika pengikatan belum diinisialisasi, maka akan memanggil Update() untuk menginisialisasi pengikatan
  • StopTracking() - Ini akan membatalkan semua pendengar yang dibuat untuk pengikatan satu arah dan dua arah. Mereka dapat diinisialisasi ulang menggunakan metode Update().

Catatan

Mulai Windows 10, versi 1607, kerangka kerja XAML menyediakan konverter Boolean ke Visibilitas bawaan. Pengonversi memetakan true ke nilai Enumerasi terlihat dan false ke Diciutkan sehingga Anda dapat mengikat properti Visibilitas ke Boolean tanpa membuat pengonversi. Perhatikan bahwa ini bukan fitur pengikatan fungsi, hanya pengikatan properti. Untuk menggunakan konverter bawaan, versi SDK target minimum aplikasi Anda harus 14393 atau yang lebih baru. Anda tidak dapat menggunakannya saat aplikasi menargetkan versi Windows 10 yang lebih lama. Untuk informasi selengkapnya tentang versi target, lihat Kode adaptif versi.

Tips Jika Anda perlu menentukan satu kurung kurawal untuk nilai, seperti di Path atau ConverterParameter, awali dengan garis miring terbalik: \{. Atau, sertakan seluruh string yang berisi kurung kurawal yang perlu melarikan diri dalam kumpulan kutipan sekunder, misalnya ConverterParameter='{Mix}'.

Converter, ConverterLanguage , dan ConverterLanguage semuanya terkait dengan skenario mengonversi nilai atau jenis dari sumber pengikatan menjadi jenis atau nilai yang kompatibel dengan properti target pengikatan. Untuk informasi dan contoh selengkapnya, lihat bagian "Konversi data" dari Pengikatan data secara mendalam.

{x:Bind} hanya ekstensi markup, tanpa cara untuk membuat atau memanipulasi pengikatan tersebut secara terprogram. Untuk informasi selengkapnya tentang ekstensi markup, lihat Gambaran umum XAML.