Bagikan melalui


Properti dependensi baca-saja

Anda dapat menggunakan properti dependensi baca-saja untuk mencegah nilai properti diatur dari luar kode Anda. Artikel ini membahas properti dependensi baca-saja yang ada serta skenario dan teknik untuk membuat properti dependensi baca-saja kustom.

Prasyarat

Artikel ini mengasumsikan pengetahuan dasar tentang properti dependensi, dan Anda telah membaca gambaran umum properti dependensi . Untuk mengikuti contoh dalam artikel ini, ini membantu jika Anda terbiasa dengan Extensible Application Markup Language (XAML) dan tahu cara menulis aplikasi WPF.

Properti dependensi baca-saja yang ada

Properti dependensi baca-saja biasanya melaporkan status, dan tidak boleh dimodifikasi melalui aksesor public. Misalnya, kerangka kerja Windows Presentation Foundation (WPF) mengimplementasikan properti IsMouseOver sebagai baca-saja karena nilainya hanya boleh ditentukan oleh input mouse. Jika IsMouseOver mengizinkan input lain, nilainya mungkin menjadi tidak konsisten dengan input mouse. Meskipun tidak dapat diatur melalui aksesor public, banyak properti dependensi baca-saja yang ada memiliki nilai yang ditentukan oleh beberapa input.

Penggunaan properti dependensi baca-saja

Properti dependensi baca-saja tidak berlaku dalam beberapa skenario di mana properti dependensi biasanya menawarkan solusi. Skenario yang tidak berlaku termasuk pengikatan data, menerapkan gaya ke nilai, validasi, animasi, dan pewarisan. Namun, properti dependensi baca-saja dapat digunakan sebagai pemicu properti dalam gaya. Misalnya, IsMouseOver umumnya digunakan untuk memicu perubahan pada latar belakang, latar depan, atau properti kontrol lain yang terlihat ketika mouse berada di atasnya. Sistem properti WPF mendeteksi dan melaporkan perubahan properti dependensi baca-saja, sehingga mendukung fungsionalitas pemicu properti. Properti dependensi baca-saja juga berguna saat menerapkan properti dependensi jenis koleksi di mana hanya elemen koleksi yang perlu ditulis, bukan objek koleksi itu sendiri. Untuk informasi selengkapnya, lihat properti dependensi tipe koleksi .

Nota

Hanya properti ketergantungan, bukan properti runtime bahasa umum biasa, yang dapat digunakan sebagai pemicu properti dalam gaya.

Membuat properti dependensi baca-saja kustom

Sebelum membuat properti dependensi yang bersifat baca-saja, periksa skenario yang tidak berlaku.

Proses pembuatan properti dependensi baca-saja dalam banyak hal mirip dengan membuat properti dependensi baca-tulis, dengan perbedaan ini:

  • Saat mendaftarkan properti baca-saja Anda, panggil RegisterReadOnly alih-alih Register.

  • Saat menerapkan pembungkus properti CLR, pastikan tidak memiliki aksesor set publik.

  • RegisterReadOnly mengembalikan DependencyPropertyKey alih-alih DependencyProperty. Simpan DependencyPropertyKey sebagai anggota kelas nonpublik.

Anda dapat menentukan nilai properti dependensi baca-saja menggunakan logika pilihan Anda. Cara yang disarankan untuk mengatur nilai properti, baik awalnya atau sebagai bagian dari logika runtime, adalah dengan menggunakan kelebihan beban SetValue yang menerima parameter jenis DependencyPropertyKey. Menggunakan SetValue lebih dianjurkan untuk mengelakkan sistem properti dan menyetel bidang sandaran secara langsung.

Bagaimana dan di mana Anda menetapkan nilai properti dependensi baca-saja dalam aplikasi Anda akan memengaruhi tingkat akses yang Anda tetapkan ke anggota kelas yang menyimpan DependencyPropertyKey. Jika Anda hanya mengatur nilai properti dari dalam kelas yang mendaftarkan properti dependensi, Anda dapat menggunakan pengubah akses private. Untuk skenario di mana nilai properti dependensi saling memengaruhi, Anda dapat menggunakan panggilan balik PropertyChangedCallback dan CoerceValueCallback yang dipasangkan untuk memicu perubahan nilai. Untuk informasi selengkapnya, lihat metadata properti ketergantungan .

Jika Anda perlu mengubah nilai properti dependensi yang hanya dapat dibaca dari luar kelas yang mendaftarkannya, Anda dapat menggunakan pengubah akses internal untuk DependencyPropertyKey. Misalnya, Anda dapat memanggil SetValue dari penanganan aktivitas di rakitan yang sama. Contoh berikut mendefinisikan kelas Aquarium yang memanggil RegisterReadOnly untuk menetapkan properti dependensi baca saja FishCount. DependencyPropertyKey ditetapkan ke bidang internal static readonly, sehingga kode dalam rakitan yang sama dapat mengubah nilai properti dependensi baca-saja.

public class Aquarium : DependencyObject
{
    // Register a dependency property with the specified property name,
    // property type, owner type, and property metadata.
    // Assign DependencyPropertyKey to a nonpublic field.
    internal static readonly DependencyPropertyKey FishCountPropertyKey =
        DependencyProperty.RegisterReadOnly(
          name: "FishCount",
          propertyType: typeof(int),
          ownerType: typeof(Aquarium),
          typeMetadata: new FrameworkPropertyMetadata());

    // Declare a public get accessor.
    public int FishCount =>
        (int)GetValue(FishCountPropertyKey.DependencyProperty);
}
Public Class Aquarium
    Inherits DependencyObject

    ' Register a dependency property with the specified property name,
    ' property type, owner type, And property metadata.
    ' Assign DependencyPropertyKey to a nonpublic field.
    Friend Shared ReadOnly FishCountPropertyKey As DependencyPropertyKey =
        DependencyProperty.RegisterReadOnly(
            name:="FishCount",
            propertyType:=GetType(Integer),
            ownerType:=GetType(Aquarium),
            typeMetadata:=New FrameworkPropertyMetadata())

    ' Declare a public get accessor.
    Public ReadOnly Property FishCount As Integer
        Get
            Return GetValue(FishCountPropertyKey.DependencyProperty)
        End Get
    End Property

End Class

Karena sistem properti WPF tidak menyebarluaskan DependencyPropertyKey di luar kode Anda, properti dependensi baca-saja memiliki keamanan penulisan yang lebih baik daripada properti dependensi baca-tulis. Gunakan properti dependensi baca saja saat Anda ingin membatasi akses penulisan kepada mereka yang memiliki referensi ke DependencyPropertyKey.

Sebaliknya, pengidentifikasi properti dependensi untuk properti dependensi yang dapat dibaca dan ditulis dapat diakses melalui sistem properti, terlepas dari pengubah akses yang Anda tentukan. Untuk informasi selengkapnya, lihat keamanan properti dependensi.

Lihat juga