Di WPF, Anda dapat menyiapkan validasi berdasarkan kesalahan yang terjadi di Lapisan Data Anda selama Pengikatan Data menggunakan ExceptionValidationRule
atau DataErrorValidationRule
.
Misalkan Anda memiliki banyak kontrol yang disiapkan dengan cara ini dan Anda memiliki tombol Simpan. Saat pengguna mengklik tombol Simpan, Anda perlu memastikan tidak ada kesalahan validasi sebelum melanjutkan penyimpanan. Jika ada kesalahan validasi, Anda ingin berteriak padanya.
Di WPF, bagaimana Anda mengetahui apakah ada kontrol Data Bound Anda yang memiliki kesalahan validasi?
wpf
validation
data-binding
Kevin Berridge
sumber
sumber
IsValid
fungsinya? Saya melihat Anda telah menyiapkan yangCanExecute
menurut saya terkait dengan perintah tombol Simpan. Apakah ini akan berhasil jika saya tidak menggunakan perintah? Dan bagaimana tombol tersebut terkait dengan kontrol lain yang perlu diperiksa? Satu-satunya pemikiran saya tentang cara menggunakan ini adalah dengan memanggilIsValid
setiap kontrol yang perlu divalidasi. Sunting: Sepertinya Anda memvalidasisender
yang saya harapkan menjadi tombol simpan. Itu sepertinya tidak benar bagi saya.Window
juga merupakan objek ketergantungan. Saya dia mungkin mengaturnya dengan semacam event handler diWindow
. Atau, Anda bisa langsung menelepon langsungIsValid(this)
dariWindow
kelas.Kode berikut (dari buku Programming WPF oleh Chris Sell & Ian Griffiths) memvalidasi semua aturan yang mengikat pada objek ketergantungan dan turunannya:
Anda dapat memanggil ini di event handler klik tombol simpan seperti ini di halaman / jendela Anda
sumber
Kode yang diposting tidak berfungsi untuk saya saat menggunakan ListBox. Saya menulis ulang dan sekarang berhasil:
sumber
Punya masalah yang sama dan mencoba solusi yang disediakan. Kombinasi solusi H-Man2 dan skiba_k bekerja hampir dengan baik untuk saya, untuk satu pengecualian: Jendela Saya memiliki TabControl. Dan aturan validasi hanya dievaluasi untuk TabItem yang saat ini terlihat. Jadi saya mengganti VisualTreeHelper dengan LogicalTreeHelper. Sekarang berhasil.
sumber
Selain implementasi LINQ yang hebat dari Dean, saya bersenang-senang membungkus kode menjadi ekstensi untuk DependencyObjects:
Ini membuatnya sangat bagus mengingat dapat digunakan kembali.
sumber
Saya akan menawarkan pengoptimalan kecil.
Jika Anda melakukan ini berkali-kali pada kontrol yang sama, Anda dapat menambahkan kode di atas untuk menyimpan daftar kontrol yang sebenarnya memiliki aturan validasi. Kemudian kapan pun Anda perlu memeriksa validitas, cukup buka kontrol tersebut, bukan seluruh pohon visual. Ini akan terbukti jauh lebih baik jika Anda memiliki banyak kontrol seperti itu.
sumber
Berikut adalah perpustakaan untuk validasi formulir di WPF. Paket nuget disini .
Sampel:
Idenya adalah kita mendefinisikan cakupan validasi melalui properti terlampir yang memberitahukan kontrol input apa yang harus dilacak. Kemudian kita bisa melakukan:
sumber
Anda dapat mengulang semua pohon kontrol Anda secara rekursif dan memeriksa properti terlampir Validation.HasErrorProperty, lalu fokus pada yang pertama Anda temukan di dalamnya.
Anda juga dapat menggunakan banyak solusi yang sudah tertulis, Anda dapat memeriksa utas ini untuk contoh dan informasi lebih lanjut
sumber
Anda mungkin tertarik dengan contoh aplikasi BookLibrary dari WPF Application Framework (WAF) . Ini menunjukkan bagaimana menggunakan validasi di WPF dan bagaimana mengontrol tombol Simpan ketika ada kesalahan validasi.
sumber
Dalam bentuk jawaban aogan, daripada mengulang secara eksplisit melalui aturan validasi, lebih baik panggil saja
expression.UpdateSource():
sumber