Ringkasan Bab 16. Pengikatan data
Catatan
Buku ini diterbitkan pada musim semi 2016, dan belum diperbarui sejak saat itu. Ada banyak dalam buku yang tetap berharga, tetapi beberapa materi sudah kedaluarsa, dan beberapa topik tidak lagi sepenuhnya benar atau lengkap.
Programmer sering kali menemukan diri mereka menulis penanganan aktivitas yang mendeteksi kapan properti dari satu objek telah berubah, dan menggunakannya untuk mengubah nilai properti di objek lain. Proses ini dapat diotomatisasi dengan teknik pengikatan data. Pengikatan data biasanya didefinisikan dalam XAML dan menjadi bagian dari definisi antarmuka pengguna.
Sangat sering, pengikatan data ini menghubungkan objek antarmuka pengguna ke data yang mendasar. Ini adalah teknik yang lebih banyak dieksplorasi dalam Bab 18. MVVM. Namun, pengikatan data juga dapat menghubungkan dua atau beberapa elemen antarmuka pengguna. Sebagian besar contoh awal pengikatan data dalam bab ini menunjukkan teknik ini.
Dasar-dasar pengikatan
Beberapa properti, metode, dan kelas terlibat dalam pengikatan data:
- Kelas
Binding
berasal dariBindingBase
dan merangkum banyak karakteristik pengikatan data - Properti
BindingContext
didefinisikan olehBindableObject
kelas - Metode
SetBinding
ini juga didefinisikan olehBindableObject
kelas - Kelas
BindableObjectExtensions
mendefinisikan tiga metode tambahanSetBinding
Dua kelas berikut mendukung ekstensi markup XAML untuk pengikatan:
BindingExtension
Binding
mendukung ekstensi markupReferenceExtension
x:Reference
mendukung ekstensi markup
Dua antarmuka terlibat dalam pengikatan data:
INotifyPropertyChanged
System.ComponentModel
di namespace layanan adalah untuk menerapkan pemberitahuan saat properti berubahIValueConverter
digunakan untuk menentukan kelas kecil yang mengonversi nilai dari satu jenis ke jenis lainnya dalam pengikatan data
Pengikatan data menghubungkan dua properti dari objek yang sama, atau (lebih umum) dua objek yang berbeda. Kedua properti ini disebut sebagai sumber dan target. Umumnya, perubahan properti sumber menyebabkan perubahan terjadi di properti target, tetapi terkadang arahnya dibalik. Terlepas:
- properti target harus didukung oleh
BindableProperty
- properti sumber umumnya adalah anggota kelas yang mengimplementasikan
INotifyPropertyChanged
Kelas yang mengimplementasikan INotifyPropertyChanged
peristiwa diaktifkan PropertyChanged
saat properti berubah nilai. BindableObject
INotifyPropertyChanged
menerapkan dan secara otomatis mengaktifkan PropertyChanged
peristiwa ketika properti yang didukung oleh BindableProperty
nilai perubahan, tetapi Anda dapat menulis kelas Anda sendiri yang menerapkan INotifyPropertyChanged
tanpa berasal dari BindableObject
.
Kode dan XAML
Sampel OpacityBindingCode menunjukkan cara mengatur pengikatan data dalam kode:
- Sumber adalah
Value
properti dariSlider
- Target adalah
Opacity
properti dariLabel
Dua objek disambungkan dengan mengatur BindingContext
Label
objek ke Slider
objek. Dua properti terhubung dengan memanggil SetBinding
metode ekstensi pada Label
referensi OpacityProperty
properti yang dapat diikat dan Value
properti yang Slider
dinyatakan sebagai string.
Memanipulasi Slider
kemudian menyebabkan Label
memudar masuk dan tidak terlihat.
OpacityBindingXaml adalah program yang sama dengan himpunan pengikatan data di XAML. dari diatur ke ekstensi markup yang x:Reference
mereferensikan Slider
, dan Opacity
properti diatur Label
ke Binding
ekstensi markup dengan propertinya Path
yang mereferensikan Value
properti dari Slider
.Label
BindingContext
Sumber dan BindingContext
Sampel BindingSourceCode menunjukkan pendekatan alternatif dalam kode. Objek Binding
dibuat dengan mengatur Source
properti ke Slider
objek dan Path
properti ke "Nilai". Metode SetBinding
BindableObject
kemudian dipanggil pada Label
objek .
Binding
Konstruktor juga dapat digunakan untuk menentukan Binding
objek.
Sampel BindingSourceXaml menunjukkan teknik yang sebanding dalam XAML. Properti diatur ke ekstensi markup dengan Path
diatur ke Value
properti dan Source
diatur ke ekstensi markup yang disematkanx:Reference
.Binding
Label
Opacity
Singkatnya, ada dua cara untuk mereferensikan objek sumber pengikatan:
BindingContext
Melalui properti targetSource
Melalui properti objek ituBinding
sendiri
Jika keduanya ditentukan, yang kedua lebih diutamakan. Keuntungannya BindingContext
adalah disebarluaskan melalui pohon visual. Ini sangat berguna jika beberapa properti target terikat ke objek sumber yang sama.
Program WebViewDemo menunjukkan teknik ini dengan WebView
elemen . Dua Button
elemen untuk menavigasi mundur dan maju mewarisi BindingContext
dari induk mereka yang mereferensikan WebView
. Properti IsEnabled
dari dua tombol kemudian memiliki ekstensi markup sederhana Binding
yang menargetkan properti tombol IsEnabled
berdasarkan pengaturan CanGoBack
properti baca-saja dan CanGoForward
dari WebView
.
Mode pengikatan
Atur Mode
properti Binding
ke anggota BindingMode
enumerasi:
OneWay
sehingga perubahan dalam properti sumber memengaruhi targetOneWayToSource
sehingga perubahan dalam properti target memengaruhi sumberTwoWay
sehingga perubahan sumber dan target saling memengaruhiDefault
untuk menggunakanDefaultBindingMode
yang ditentukan ketika targetBindableProperty
dibuat. Jika tidak ada yang ditentukan, defaultnya adalahOneWay
untuk properti normal yang dapat diikat, danOneWayToSource
untuk properti yang dapat diikat baca-saja.
Catatan
Enumerasi BindingMode
sekarang juga termasuk OnTime
untuk menerapkan pengikatan hanya ketika konteks pengikatan berubah dan bukan ketika properti sumber berubah.
Properti yang kemungkinan menjadi target pengikatan data dalam skenario MVVM umumnya memiliki DefaultBindingMode
.TwoWay
Ini adalah:
Value
properti dariSlider
danStepper
IsToggled
properti dariSwitch
Text
properti dariEntry
,Editor
, danSearchBar
Date
properti dariDatePicker
Time
properti dariTimePicker
Sampel BindingModes menunjukkan empat mode pengikatan dengan pengikatan data di mana target adalah FontSize
properti dan Label
sumbernya adalah Value
properti dari Slider
. Ini memungkinkan masing-masing Slider
untuk mengontrol ukuran font dari yang sesuai Label
. Slider
Tetapi elemen tidak diinisialisasi karena DefaultBindingMode
FontSize
propertinya adalah OneWay
.
Sampel ReverseBinding mengatur pengikatan pada Value
properti Slider
FontSize
referensi properti masing-masing Label
. Ini tampaknya mundur, tetapi bekerja lebih baik dalam menginisialisasi Slider
elemen karena Value
properti dari Slider
memiliki DefaultBindingMode
.TwoWay
Ini dianalogikan dengan bagaimana pengikatan didefinisikan dalam MVVM, dan Anda akan sering menggunakan jenis pengikatan ini.
Pemformatan string
Ketika properti target berjenis string
, Anda dapat menggunakan properti yang StringFormat
ditentukan oleh BindingBase
untuk mengonversi sumber menjadi string
. Atur StringFormat
properti ke string pemformatan .NET yang akan Anda gunakan dengan format statis String.Format
untuk menampilkan objek. Saat menggunakan string pemformatan ini dalam ekstensi markup, kelilingi dengan tanda kutip tunggal sehingga kurung kurawal tidak akan keliru untuk ekstensi markup yang disematkan.
Sampel ShowViewValues menunjukkan cara menggunakan StringFormat
di XAML.
Sampel WhatSizeBindings menunjukkan menampilkan ukuran halaman dengan pengikatan ke Width
properti dan Height
dari ContentPage
.
Mengapa disebut "Jalur"?
Properti Path
Binding
dipanggil karena dapat berupa serangkaian properti dan pengindeks yang dipisahkan oleh titik. Sampel BindingPathDemos menunjukkan beberapa contoh.
Pengikatan pengonversi nilai
Saat properti sumber dan target pengikatan memiliki jenis yang berbeda, Anda dapat mengonversi antara jenis menggunakan pengikatan pengonversi. Ini adalah kelas yang mengimplementasikan IValueConverter
antarmuka dan berisi dua metode: Convert
untuk mengonversi sumber ke target, dan ConvertBack
untuk mengonversi target ke sumber.
Kelas IntToBoolConverter
di Xamarin.Formspustaka Book.Toolkit adalah contoh untuk mengonversi int
ke .bool
Ini ditunjukkan oleh sampel ButtonEnabler , yang hanya memungkinkan Button
jika setidaknya satu karakter telah diketik ke dalam Entry
.
Kelas BoolToStringConverter
mengonversi menjadi string
bool
dan menentukan dua properti untuk menentukan teks apa yang harus dikembalikan dan false
true
nilainya.
Mirip BoolToColorConverter
. Sampel SwitchText menunjukkan penggunaan kedua pengonversi ini untuk menampilkan teks yang berbeda dalam warna yang berbeda berdasarkan Switch
pengaturan.
Generik BoolToObjectConverter
dapat menggantikan BoolToStringConverter
dan BoolToColorConverter
berfungsi sebagai pengonversi -ke-objek umum bool
dari jenis apa pun.
Pengikatan dan tampilan kustom
Anda dapat menyederhanakan kontrol kustom menggunakan pengikatan data. File NewCheckBox.cs
kode mendefinisikan Text
properti , TextColor
, FontSize
, FontAttributes
, dan IsChecked
, tetapi tidak memiliki logika sama sekali untuk visual kontrol.
NewCheckBox.cs.xaml
Sebaliknya, file berisi semua markup untuk visual kontrol melalui pengikatan data pada Label
elemen berdasarkan properti yang ditentukan dalam file code-behind.
Sampel NewCheckBoxDemo menunjukkan NewCheckBox
kontrol kustom.