Bagikan melalui


Peristiwa perubahan properti (WPF .NET)

Windows Presentation Foundation (WPF) mendefinisikan beberapa peristiwa yang dinaikkan sebagai respons terhadap perubahan nilai properti. Seringkali properti adalah properti dependensi. Peristiwa itu sendiri dapat menjadi peristiwa yang dirutekan atau peristiwa runtime bahasa umum standar (CLR), tergantung pada apakah peristiwa harus dirutekan melalui pohon elemen, atau hanya terjadi pada objek tempat properti berubah. Skenario terakhir berlaku ketika perubahan properti hanya relevan dengan objek tempat nilai properti berubah.

Prasyarat

Artikel ini mengasumsikan pengetahuan dasar tentang properti dependensi, dan anda telah membaca ringkasan peristiwa yang dirutekan.

Mengidentifikasi peristiwa properti yang diubah

Tidak semua peristiwa yang melaporkan perubahan properti secara eksplisit diidentifikasi sebagai peristiwa yang diubah properti melalui pola tanda tangan atau penamaannya. Dokumentasi SDK mereferensikan silang properti dengan peristiwa dan menunjukkan apakah peristiwa secara langsung terkait dengan perubahan nilai properti.

Beberapa peristiwa menggunakan jenis data peristiwa dan delegasi yang khusus untuk peristiwa yang diubah properti. Misalnya, peristiwa RoutedPropertyChanged dan DependencyPropertyChanged masing-masing memiliki tanda tangan tertentu. Jenis peristiwa ini dibahas di bagian berikut.

Peristiwa RoutedPropertyChanged

Peristiwa RoutedPropertyChanged memiliki RoutedPropertyChangedEventArgs<T> data peristiwa dan RoutedPropertyChangedEventHandler<T> delegasi. Baik data peristiwa maupun delegasi memiliki parameter Tjenis generik . Anda menentukan jenis aktual properti yang diubah saat Anda menentukan handler. Data peristiwa berisi OldValue properti dan NewValue , yang jenis runtime-nya sama dengan properti yang diubah.

Bagian "Dirutekan" dari nama menunjukkan bahwa peristiwa yang diubah properti terdaftar sebagai peristiwa yang dirutekan. Keuntungan dari peristiwa rute yang diubah properti adalah bahwa elemen induk diberi tahu setiap kali properti elemen turunan berubah. Ini berarti bahwa elemen tingkat atas kontrol menerima peristiwa yang diubah properti ketika nilai salah satu bagian kompositnya berubah. Misalnya, Anda membuat kontrol yang menggabungkan RangeBase kontrol, seperti Slider. Value Jika properti berubah pada bagian penggeser, Anda dapat menangani perubahan tersebut pada kontrol induk daripada pada bagian .

Hindari menggunakan penanganan aktivitas yang diubah properti untuk memvalidasi nilai properti, karena itu bukan niat desain untuk sebagian besar peristiwa yang diubah properti. Umumnya, peristiwa properti yang diubah disediakan sehingga Anda dapat merespons perubahan nilai di area logika lain dari kode Anda. Mengubah nilai properti lagi dari dalam penanganan aktivitas yang diubah properti tidak disarankan, dan dapat menyebabkan rekursi yang tidak disengaja tergantung pada implementasi handler Anda.

Jika properti Anda adalah properti dependensi kustom, atau jika Anda bekerja dengan kelas turunan tempat Anda menentukan kode instans, sistem properti WPF memiliki cara yang lebih baik untuk melacak perubahan properti. Cara itu adalah dengan menggunakan panggilan balik sistem properti dan PropertyChangedCallback bawaanCoerceValueCallback. Untuk informasi selengkapnya tentang bagaimana Anda dapat menggunakan sistem properti WPF untuk validasi dan koersi, lihat Callback properti dependensi dan properti Validasi dan Dependensi kustom.

Peristiwa DependencyPropertyChanged

Peristiwa DependencyPropertyChanged memiliki DependencyPropertyChangedEventArgs data peristiwa dan DependencyPropertyChangedEventHandler delegasi. Peristiwa ini adalah peristiwa CLR standar, bukan peristiwa yang dirutekan. DependencyPropertyChangedEventArgs adalah jenis pelaporan data peristiwa yang tidak biasa karena tidak berasal dari EventArgs dan merupakan struktur, bukan kelas.

Salah satu contoh DependencyPropertyChanged peristiwa adalah IsMouseCapturedChanged. DependencyPropertyChanged peristiwa sedikit lebih umum daripada RoutedPropertyChanged peristiwa.

Mirip dengan data peristiwa RoutedPropertyChanged, data peristiwa DependencyPropertyChanged berisi OldValue properti dan NewValue . Untuk alasan yang disebutkan sebelumnya, hindari penggunaan properti yang diubah penanganan aktivitas untuk mengubah nilai properti lagi.

Pemicu properti

Konsep yang terkait erat dengan peristiwa yang diubah properti adalah pemicu properti. Pemicu properti dibuat dalam gaya atau templat. Pemicu properti memungkinkan Anda membuat perilaku kondisional berdasarkan nilai properti tempat pemicu ditetapkan.

Properti tempat pemicu properti bertindak harus merupakan properti dependensi. Bisa jadi, dan sering adalah, properti dependensi baca-saja. Jika properti dependensi yang diekspos oleh kontrol memiliki nama yang dimulai dengan "Is", itu adalah indikator yang baik bahwa properti setidaknya dirancang sebagian untuk menjadi pemicu properti. Properti dengan penamaan ini seringkali merupakan properti dependensi baca-saja Boolean , di mana skenario utama untuk properti melaporkan status kontrol. Jika status kontrol memengaruhi UI real-time, maka properti dependensi adalah kandidat pemicu properti.

Beberapa properti dependensi memiliki peristiwa perubahan properti khusus. Misalnya, IsMouseCaptured memiliki peristiwa perubahan IsMouseCapturedChanged properti. Properti IsMouseCaptured bersifat baca-saja dan nilainya dimodifikasi oleh sistem input. Sistem input meningkatkan IsMouseCapturedChanged peristiwa pada setiap perubahan real-time.

Batasan pemicu properti

Dibandingkan dengan peristiwa perubahan properti benar, pemicu properti memiliki beberapa batasan.

Pemicu properti bekerja melalui logika kecocokan yang tepat, di mana Anda menentukan nama properti dan nilai tertentu yang akan mengaktifkan pemicu. Contohnya <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Sintaks pemicu properti membatasi sebagian besar penggunaan pemicu properti ke Boolean properti, atau properti yang mengambil nilai enumerasi khusus. Rentang nilai yang mungkin harus dapat dikelola, sehingga Anda dapat menentukan pemicu untuk setiap kasus. Terkadang pemicu properti hanya ada untuk nilai khusus, seperti ketika jumlah item mencapai nol. Pemicu tunggal tidak dapat diatur untuk diaktifkan saat nilai properti berubah jauh dari nilai tertentu, seperti nol. Alih-alih menggunakan beberapa pemicu untuk semua kasus nonzero, pertimbangkan untuk menerapkan penanganan aktivitas kode, atau perilaku default yang beralih kembali dari status pemicu setiap kali nilainya bukan nol.

Sintaks pemicu properti dianalogikan dengan pernyataan "if" dalam pemrograman. Jika kondisi pemicu benar, maka "isi" pemicu properti adalah "jalankan". "Isi" pemicu properti bukan kode, markup-nya. Markup tersebut terbatas pada penggunaan satu atau beberapa Setter elemen untuk mengatur properti objek lain tempat gaya atau templat diterapkan.

Ketika kondisi "jika" pemicu properti memiliki berbagai nilai yang mungkin, disarankan untuk mengatur nilai properti yang sama ke default dengan menggunakan Setter di luar pemicu. Dengan begitu, setter dalam pemicu akan lebih diutamakan ketika kondisi pemicu adalah true, jika tidak Setter , di luar pemicu akan lebih diutamakan.

Pemicu properti berguna untuk skenario di mana satu atau beberapa properti tampilan harus berubah berdasarkan status properti lain pada elemen yang sama.

Untuk mempelajari selengkapnya tentang pemicu properti, lihat Gaya dan Templat.

Lihat juga