Bagikan melalui


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:

Cuplikan layar tiga kali berbagi hierarki kelas

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 SetValueLabel.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 BindablePropertybaca-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 CLR
  • declaringType: jenis kelas yang mendeklarasikan properti
  • defaultValue: 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 valid
  • propertyChanging: panggilan balik untuk menunjukkan kapan properti akan berubah
  • coerceValue: panggilan balik untuk memaksa nilai yang ditetapkan ke nilai lain
  • defaultValueCreate: 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 BindablePropertyKeybaca-saja statis privat .

Kemudian, tentukan akselerasi properti set CLR untuk memanggil SetValue kelebihan beban dengan BindablePropertyKeyprivate objek . Ini mencegah properti diatur di luar kelas.

Ini ditunjukkan di kelas yang CountedLabel digunakan dalam sampel BaskervillesCount .