Ringkasan Bab 11. Infrastruktur yang dapat diikat
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.
Setiap programmer C# terbiasa dengan properti C#. Properti berisi aksesor yang ditetapkan dan/atau aksesor get . Mereka sering disebut properti CLR untuk Common Language Runtime.
Xamarin.Formsmenentukan definisi properti yang ditingkatkan yang disebut properti yang dapat diikat yang dienkapsulasi oleh BindableProperty
kelas dan didukung oleh BindableObject
kelas . Kelas-kelas ini terkait tetapi cukup berbeda: Digunakan BindableProperty
untuk menentukan properti itu sendiri; BindableObject
seperti object
di dalamnya adalah kelas dasar untuk kelas yang menentukan properti yang dapat diikat.
Xamarin.Forms Hierarki kelas
Sampel ClassHierarchy menggunakan refleksi untuk menampilkan hierarki Xamarin.Forms kelas dan menunjukkan peran penting yang dimainkan oleh BindableObject
dalam hierarki ini. BindableObject
berasal dari Object
dan merupakan kelas Element
induk dari mana VisualElement
berasal. Ini adalah kelas induk ke Page
dan View
, yang merupakan kelas induk untuk Layout
:
Mengintip BindableObject dan BindableProperty
Dalam kelas yang berasal dari BindableObject
banyak properti CLR dikatakan "didukung oleh" properti yang dapat diikat. Misalnya, Text
properti Label
kelas adalah properti CLR, tetapi Label
kelas juga mendefinisikan bidang baca-saja statis publik bernama TextProperty
jenis BindableProperty
.
Aplikasi dapat mengatur atau mendapatkan Text
properti Label
secara normal, atau aplikasi dapat mengatur Text
dengan memanggil metode yang SetValue
Label.TextProperty
ditentukan oleh BindableObject
dengan argumen. Demikian pula, aplikasi dapat memperoleh nilai Text
properti dengan memanggil GetValue
metode , sekali lagi dengan Label.TextProperty
argumen . Ini ditunjukkan oleh sampel Properti Pengaturan.
Memang, Text
properti CLR sepenuhnya diimplementasikan menggunakan SetValue
metode dan GetValue
yang ditentukan oleh BindableObject
bersama dengan Label.TextProperty
properti statis.
BindableObject
dan BindableProperty
memberikan dukungan untuk:
- Memberikan nilai default properti
- Menyimpan nilainya saat ini
- Menyediakan mekanisme untuk memvalidasi nilai properti
- Mempertahankan konsistensi di antara properti terkait dalam satu kelas
- Menanggapi perubahan properti
- Memicu pemberitahuan saat properti akan berubah atau telah berubah
- Mendukung pengikatan data
- Gaya pendukung
- Mendukung sumber daya dinamis
Setiap kali properti yang didukung oleh properti yang dapat diikat berubah, BindableObject
peristiwa akan PropertyChanged
mengidentifikasi properti yang telah berubah. Kejadian ini tidak diaktifkan ketika properti diatur ke nilai yang sama.
Beberapa properti tidak didukung oleh properti yang dapat diikat, dan beberapa Xamarin.Forms kelas — seperti Span
— tidak berasal dari BindableObject
. Hanya kelas yang berasal dari BindableObject
yang dapat mendukung properti yang dapat diikat karena BindableObject
mendefinisikan SetValue
metode dan GetValue
.
Karena Span
tidak berasal dari BindableObject
, tidak ada propertinya — seperti Text
— didukung oleh properti yang dapat diikat. Inilah sebabnya mengapa DynamicResource
pengaturan pada Text
properti Span
menimbulkan pengecualian dalam sampel DynamicVsStatic di bab sebelumnya. Sampel DynamicVsStaticCode menunjukkan cara mengatur sumber daya dinamis dalam kode menggunakan metode yang SetDynamicResource
ditentukan oleh Element
. Argumen pertama adalah objek jenis BindableProperty
.
Demikian pula, metode yang SetBinding
ditentukan oleh BindableObject
memiliki argumen pertama dari jenis BindableProperty
.
Menentukan properti yang dapat diikat
Anda dapat menentukan properti yang dapat diikat Anda sendiri menggunakan metode statis BindableProperty.Create
untuk membuat bidang jenis BindableProperty
baca-saja statis .
Ini ditunjukkan di AltLabel
kelas di Xamarin.Formspustaka Book.Toolkit. Kelas berasal dari Label
dan memungkinkan Anda menentukan ukuran font dalam poin. Ini ditunjukkan dalam sampel PointSizedText.
Empat argumen BindableProperty.Create
metode diperlukan:
propertyName
: nama teks properti (sama dengan nama properti CLR)returnType
: jenis properti CLRdeclaringType
: jenis kelas yang mendeklarasikan propertidefaultValue
: nilai default properti
Karena defaultValue
berjenis object
, pengkompilasi harus dapat menentukan jenis nilai default. Misalnya, jika returnType
adalah double
, defaultValue
harus diatur ke sesuatu seperti 0,0 daripada hanya 0, atau ketidakcocokan jenis akan memicu pengecualian pada runtime.
Ini juga sangat umum untuk properti yang dapat diikat untuk menyertakan:
propertyChanged
: metode statis yang dipanggil ketika properti mengubah nilai. Argumen pertama adalah instans kelas yang propertinya telah diubah.
Argumen lain yang BindableProperty.Create
tidak umum:
defaultBindingMode
: digunakan sehubungan dengan pengikatan data (seperti yang dibahas dalam Bab 16. Pengikatan data)validateValue
: panggilan balik untuk memeriksa nilai yang validpropertyChanging
: panggilan balik untuk menunjukkan kapan properti akan berubahcoerceValue
: panggilan balik untuk memaksa nilai yang ditetapkan ke nilai laindefaultValueCreate
: panggilan balik untuk membuat nilai default yang tidak dapat dibagikan di antara instans kelas (misalnya, koleksi)
Properti yang dapat diikat baca-saja
Properti yang dapat diikat dapat bersifat baca-saja. Membuat properti yang dapat diikat baca-saja mengharuskan memanggil metode BindableProperty.CreateReadOnly
statis untuk menentukan bidang tipe BindablePropertyKey
baca-saja statis privat .
Kemudian, tentukan akselerasi properti set
CLR untuk memanggil SetValue
kelebihan beban dengan BindablePropertyKey
private
objek . Ini mencegah properti diatur di luar kelas.
Ini ditunjukkan di kelas yang CountedLabel
digunakan dalam sampel BaskervillesCount .