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 me-refresh 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 yang dikompilasi) 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}" .../>
Persyaratan | Deskripsi |
---|---|
propertyPath | String yang menentukan jalur properti untuk pengikatan. Info selengkapnya ada di bagian Jalur properti di bawah ini. |
bindingProperties | |
nilai propName=[, nilai propName=]* | Satu atau beberapa properti pengikatan yang ditentukan menggunakan sintaks pasangan nama/nilai. |
propName | Nama string properti yang akan diatur pada objek pengikatan. Misalnya, "Converter". |
value | Nilai untuk mengatur properti ke. Sintaks argumen tergantung pada properti yang diatur. Berikut adalah contoh penggunaan nilai propName=di mana nilai itu sendiri adalah ekstensi markup: Converter={StaticResource myConverterClass} . Untuk informasi selengkapnya, lihat Properti yang bisa Anda atur dengan bagian {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 mengatur 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—sebagai gantinya, data tersebut 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-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 ke 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, bahkan jika 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. Hat (^) 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 properti tersebut akan mendaftar dan mendengarkan pemberitahuan perubahan pada antarmuka tersebut. Logika deteksi perubahan akan diperbarui berdasarkan semua perubahan koleksi, bahkan jika 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 cast 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 terlampir, dan merupakan sintaks yang direkomendasikan ke depannya.
Transmisi tanpa jalur
Pengurai ikat 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 dengan {x:Bind MethodName(this)}
.
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 pengikatan data 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 peristiwa.
- ATAU tidak memiliki parameter.
- OR memiliki jumlah parameter jenis yang sama yang dapat ditetapkan dari jenis parameter peristiwa.
Dalam kode yang dihasilkan di belakang, 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 pasangan nilai propName=yang dipisahkan koma. Perhatikan bahwa Anda tidak dapat menyertakan hentian baris dalam ekspresi pengikatan. Beberapa properti memerlukan jenis yang tidak memiliki konversi jenis, sehingga ini memerlukan ekstensi markup miliknya 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 di 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 pengonversi 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, lihat Komentar 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 ketika 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 waktu proses.
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 pengikatan akan memanggil Update() untuk menginisialisasi pengikatan
- StopTracking() - Ini akan melepas semua pendengar yang dibuat untuk pengikatan satu arah dan dua arah. Mereka dapat diinisialisasi ulang menggunakan metode Update().
Catatan
Mulai dari 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 kurung kurawal tunggal untuk nilai, seperti di Jalur atau ConverterParameter, awali dengan garis miring terbalik: . \{
Atau, sertakan seluruh string yang berisi kurung kurawal yang perlu melarikan diri dalam set 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} adalah ekstensi markup saja, tanpa cara untuk membuat atau memanipulasi pengikatan tersebut secara terprogram. Untuk informasi selengkapnya tentang ekstensi markup, lihat Gambaran umum XAML.