Bagikan melalui


Properti dependensi baca-saja (WPF .NET)

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.

Penting

Dokumentasi Panduan Desktop untuk .NET 7 dan .NET 6 sedang dibangun.

Prasyarat

Artikel ini mengasumsikan pengetahuan dasar tentang properti dependensi, dan bahwa 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 public aksesor. Misalnya, kerangka kerja Windows Presentation Foundation (WPF) mengimplementasikan IsMouseOver properti sebagai baca-saja karena nilainya hanya boleh ditentukan oleh input mouse. Jika IsMouseOver diizinkan input lain, nilainya mungkin menjadi tidak konsisten dengan input mouse. Meskipun tidak dapat diatur melalui public aksesor, 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 jenis koleksi.

Catatan

Hanya properti dependensi, 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 adalah dalam banyak cara yang 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 publik set .

  • RegisterReadOnly mengembalikan alih-alih DependencyPropertyKeyDependencyProperty. Simpan dalam DependencyPropertyKey anggota kelas nonpublik.

Anda dapat menentukan nilai properti dependensi baca-saja menggunakan logika apa pun yang Anda pilih. 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. Penggunaan SetValue lebih disukai untuk menghindari sistem properti dan mengatur bidang pencadangan 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 private pengubah akses. Untuk skenario di mana nilai properti dependensi saling memengaruhi, Anda dapat menggunakan pasangan PropertyChangedCallback dan CoerceValueCallback panggilan balik untuk memicu perubahan nilai. Untuk informasi selengkapnya, lihat Metadata properti dependensi.

Jika Anda perlu mengubah nilai properti dependensi baca-saja dari luar kelas yang mendaftarkannya, Anda dapat menggunakan internal pengubah akses untuk DependencyPropertyKey. Misalnya, Anda dapat memanggil SetValue dari penanganan aktivitas di rakitan yang sama. Contoh berikut mendefinisikan kelas Aquarium yang memanggil RegisterReadOnly untuk membuat properti FishCountdependensi baca-saja . DependencyPropertyKey ditetapkan ke internal static readonly bidang, 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 tulis yang lebih baik daripada properti dependensi baca-tulis. Gunakan properti dependensi baca-saja saat Anda ingin membatasi akses tulis kepada mereka yang memiliki referensi ke DependencyPropertyKey.

Sebaliknya, pengidentifikasi properti dependensi untuk properti dependensi baca-tulis dapat diakses melalui sistem properti, apa pun pengubah akses yang Anda tetapkan. Untuk informasi selengkapnya, lihat Keamanan properti dependensi.

Baca juga