Bagikan melalui


Peristiwa Perubahan Properti

Windows Presentation Foundation (WPF) mendefinisikan beberapa peristiwa yang dinaikkan sebagai respons terhadap perubahan nilai properti. Seringkali properti adalah properti dependensi. Peristiwa itu sendiri terkadang merupakan peristiwa yang dirutekan dan terkadang merupakan peristiwa runtime bahasa umum standar (CLR). Definisi peristiwa bervariasi tergantung pada skenario, karena beberapa perubahan properti lebih tepat dirutekan melalui pohon elemen, sedangkan perubahan properti lainnya umumnya hanya menjadi perhatian pada objek tempat properti berubah.

Mengidentifikasi Peristiwa Perubahan Properti

Tidak semua peristiwa yang melaporkan perubahan properti secara eksplisit diidentifikasi sebagai peristiwa yang diubah properti, baik berdasarkan pola tanda tangan atau pola penamaan. Umumnya, deskripsi peristiwa dalam dokumentasi SDK menunjukkan apakah peristiwa secara langsung terkait dengan perubahan nilai properti dan memberikan referensi silang antara properti dan peristiwa.

Peristiwa RoutedPropertyChanged

Peristiwa tertentu menggunakan jenis data peristiwa dan delegasi yang secara eksplisit digunakan untuk peristiwa perubahan properti. Jenis data peristiwa adalah RoutedPropertyChangedEventArgs<T>, dan delegasinya adalah RoutedPropertyChangedEventHandler<T>. Data peristiwa dan delegasi keduanya memiliki parameter jenis generik yang digunakan untuk menentukan jenis aktual properti yang berubah saat Anda menentukan handler. Data peristiwa berisi dua properti, OldValue dan NewValue, yang keduanya kemudian diteruskan sebagai argumen jenis dalam data peristiwa.

Bagian "Dirutekan" dari nama menunjukkan bahwa peristiwa yang diubah properti terdaftar sebagai peristiwa yang dirutekan. Keuntungan merutekan peristiwa yang diubah properti adalah bahwa tingkat atas kontrol dapat menerima peristiwa yang diubah properti jika properti pada elemen turunan (bagian komposit kontrol) mengubah nilai. Misalnya, Anda dapat membuat kontrol yang menggabungkan RangeBase kontrol seperti Slider. Jika nilai Value properti berubah pada bagian penggeser, Anda mungkin ingin menangani perubahan tersebut pada kontrol induk daripada pada bagian .

Karena Anda memiliki nilai lama dan nilai baru, mungkin tergoda untuk menggunakan penanganan aktivitas ini sebagai validator untuk nilai properti. Namun, itu bukan niat desain dari sebagian besar peristiwa yang diubah properti. Umumnya, nilai disediakan sehingga Anda dapat bertindak berdasarkan nilai-nilai tersebut di area logika lain dari kode Anda, tetapi benar-benar mengubah nilai dari dalam penanganan aktivitas tidak disarankan, dan dapat menyebabkan pengulangan yang tidak disengaja tergantung pada bagaimana handler Anda diterapkan.

Jika properti Anda adalah properti dependensi kustom, atau jika Anda bekerja dengan kelas turunan tempat Anda telah menentukan kode instansiasi, ada mekanisme yang jauh lebih baik untuk melacak perubahan properti yang dibangun pada sistem properti WPF: panggilan balik CoerceValueCallback sistem properti dan PropertyChangedCallback. Untuk detail selengkapnya tentang bagaimana Anda dapat menggunakan sistem properti WPF untuk validasi dan koersi, lihat Callback Properti Dependensi dan Validasi dan Properti Dependensi Kustom.

Peristiwa DependencyPropertyChanged

Pasangan jenis lain yang merupakan bagian dari skenario peristiwa yang diubah properti adalah DependencyPropertyChangedEventArgs dan DependencyPropertyChangedEventHandler. Peristiwa untuk perubahan properti ini tidak dirutekan; mereka adalah peristiwa CLR standar. DependencyPropertyChangedEventArgs adalah jenis pelaporan data peristiwa yang tidak biasa karena tidak berasal dari EventArgs; DependencyPropertyChangedEventArgs adalah struktur, bukan kelas.

Peristiwa yang menggunakan DependencyPropertyChangedEventArgs dan DependencyPropertyChangedEventHandler sedikit lebih umum daripada RoutedPropertyChanged peristiwa. Contoh peristiwa yang menggunakan jenis ini adalah IsMouseCapturedChanged.

Seperti RoutedPropertyChangedEventArgs<T>, DependencyPropertyChangedEventArgs juga melaporkan nilai lama dan baru untuk properti . Selain itu, pertimbangan yang sama tentang apa yang dapat Anda lakukan dengan nilai berlaku; umumnya tidak disarankan agar Anda mencoba mengubah nilai lagi pada pengirim sebagai respons terhadap peristiwa tersebut.

Pemicu Properti

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

Properti untuk pemicu properti harus merupakan properti dependensi. Ini bisa (dan sering adalah) properti dependensi baca-saja. Indikator yang baik ketika properti dependensi yang diekspos oleh kontrol setidaknya dirancang sebagian untuk menjadi pemicu properti adalah jika nama properti dimulai dengan "Is". Properti yang memiliki penamaan ini sering kali merupakan properti dependensi Boolean baca-saja di mana skenario utama untuk properti melaporkan status kontrol yang mungkin memiliki konsekuensi terhadap UI real-time dan dengan demikian merupakan kandidat pemicu properti.

Beberapa properti ini juga memiliki peristiwa perubahan properti khusus. Misalnya, properti IsMouseCaptured memiliki peristiwa IsMouseCapturedChangedyang diubah properti . Properti itu sendiri bersifat baca-saja, dengan nilainya disesuaikan oleh sistem input, dan sistem input muncul IsMouseCapturedChanged pada setiap perubahan real-time.

Dibandingkan dengan peristiwa perubahan properti true, menggunakan pemicu properti untuk bertindak pada perubahan properti memiliki beberapa batasan.

Pemicu properti bekerja melalui logika kecocokan yang tepat. Anda menentukan properti dan nilai yang menunjukkan nilai tertentu di mana pemicu akan bertindak. Misalnya: <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Karena keterbatasan ini, sebagian besar penggunaan pemicu properti akan untuk properti Boolean, atau properti yang mengambil nilai enumerasi khusus, di mana rentang nilai yang mungkin cukup dapat dikelola untuk menentukan pemicu untuk setiap kasus. Atau pemicu properti mungkin hanya ada untuk nilai khusus, seperti ketika jumlah item mencapai nol, dan tidak akan ada pemicu yang memperhitungkan kasus ketika nilai properti berubah jauh dari nol lagi (alih-alih pemicu untuk semua kasus, Anda mungkin memerlukan penanganan peristiwa kode di sini, atau perilaku default yang beralih kembali dari status pemicu lagi ketika nilainya bukan nol).

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

Untuk mengimbangi kondisi "jika" pemicu properti yang memiliki berbagai nilai yang mungkin, umumnya disarankan untuk mengatur nilai properti yang sama ke default dengan menggunakan Setter. Dengan cara ini, Trigger setter yang terkandung akan lebih diutamakan ketika kondisi pemicu benar, dan Setter yang tidak berada dalam Trigger akan diutamakan setiap kali kondisi pemicu salah.

Pemicu properti umumnya sesuai 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.

Baca juga