WPF Veri Bağlama ve Doğrulama Kuralları En İyi Uygulamaları


101

Bazı özel CLR nesnelerinin düzenlenmesine izin vermek için veri bağlamayı kullandığım çok basit bir WPF uygulamam var. Şimdi, kullanıcı kaydet'i tıkladığında bazı giriş doğrulamaları koymak istiyorum. Ancak, okuduğum tüm WPF kitapları bu konuya pek yer ayırmıyor. Özel ValidationRules oluşturabileceğinizi görüyorum, ancak bunun ihtiyaçlarım için gereğinden fazla olup olmayacağını merak ediyorum.

Öyleyse sorum şu: WPF'de kullanıcı girişini doğrulamak için en iyi uygulamayı gösteren iyi bir örnek uygulama veya makale var mı?

Yanıtlar:


83

Yeni tercih edilen yolun IDataErrorInfo kullanmak olabileceğini düşünüyorum

Daha fazlasını buradan okuyun


3
Ayrıca RCA çerçevesini (buldum cinch.codeplex.com WPF + MVVM en iyi uygulamaları doğrulama bir demo içerir), ve IDataErrorInfo kullanır
Mark Heath

3
.NET 4.5'te, yalnızca dizeler yerine nesneleri döndürmenize olanak tanıyan INotifyErrorInfo kullanabilirsiniz.
Peter

24

MS Modeller ve Uygulamalar belgelerinden :

Veri Doğrulama ve Hata Raporlama

Görünüm modelinizin veya modelinizin genellikle veri doğrulaması yapması ve herhangi bir veri doğrulama hatasını görünüme bildirmesi gerekir, böylece kullanıcı bunları düzeltmek için harekete geçebilir.

Silverlight ve WPF, görünümdeki denetimlere bağlı olan tek tek özellikleri değiştirirken oluşan veri doğrulama hatalarını yönetmek için destek sağlar. Bir denetime veriye bağlı olan tek özellikler için, görünüm modeli veya modeli, gelen hatalı bir değeri reddederek ve bir istisna atarak özellik ayarlayıcı içinde bir veri doğrulama hatasını işaret edebilir. Veri bağlamadaki ValidatesOnExceptions özelliği true ise, WPF ve Silverlight'taki veri bağlama motoru istisnayı işler ve kullanıcıya bir veri doğrulama hatası olduğuna dair görsel bir ipucu görüntüler.

Ancak, özelliklerle ilgili istisnaların bu şekilde atılmasından mümkün olduğunca kaçınılmalıdır. Alternatif bir yaklaşım, IDataErrorInfo veya INotifyDataErrorInfo arabirimlerini görünüm modeliniz veya model sınıflarınız üzerinde uygulamaktır. Bu arabirimler, görünüm modelinizin veya modelinizin bir veya daha fazla özellik değeri için veri doğrulaması gerçekleştirmesine ve kullanıcının hatadan haberdar olabilmesi için görünüme bir hata mesajı döndürmesine olanak tanır.

Belgeler, IDataErrorInfo ve INotifyDataErrorInfo'nun nasıl uygulanacağını açıklamaya devam eder.


3
İlk başta bir istisna önerisi attığını görünce endişelendim. Bunun ardından "mülklerle ilgili istisnaları bu şekilde atmaktan mümkün olduğu kadar kaçınılması gerektiğini"
görmekten memnunum

22
microsoft'taki bazı muppet'lerin INotifyDataErrorInfo'yı .net4'e değil, Yalnızca silverlight'a dahil etmemeye karar verdiğine de dikkat edilmelidir. bu bir acı ..
aL3891

5
@ al3891- bu .NET
4.5-

@ aL3891 Eksik INotifyDataErrorInfo için herhangi bir alternatif var mı?
AgentKnopf

10

şahsen, doğrulamayı işlemek için istisnalar kullanıyorum. aşağıdaki adımları gerektirir:

  1. veri bağlama ifadenizde "ValidatesOnException = True" eklemeniz gerekir
  2. Bağlandığınız veri nesnenizde, yeni değerin koşullarınızı karşılayıp karşılamadığını kontrol ettiğiniz DependencyPropertyChanged işleyicisini eklemeniz gerekir - değilse - nesnenin eski değerine geri yüklersiniz (gerekirse) ve istisna atarsınız.
  3. Kontrolde geçersiz değeri görüntülemek için kullandığınız kontrol şablonunuzda, Hata toplamaya erişebilir ve istisna mesajı görüntüleyebilirsiniz.

Buradaki hile, yalnızca DependencyObject'ten türetilen nesnelere bağlanmaktır. Basit INotifyPropertyChanged uygulaması işe yaramaz - çerçevede hata koleksiyonuna erişmenizi engelleyen bir hata vardır.


3

Ayrıca bu makaleye bakın . Sözde Microsoft, Enterprise Library'yi (v4.0) doğrulama konusunu kapsadıkları kalıplarından ve uygulamalarından çıkardı, ancak tanrı neden WPF için doğrulamayı dahil etmediklerini biliyor, bu yüzden sizi yönlendirdiğim blog yazısı, yazarın ne olduğunu açıklıyor adapte etmek için yaptı. Bu yardımcı olur umarım!


2

WPF Uygulama Çerçevesi'nin (WAF) BookLibrary örnek uygulaması ilginizi çekebilir . WPF'de doğrulamanın nasıl kullanılacağını ve doğrulama hataları olduğunda Kaydet düğmesinin nasıl kontrol edileceğini gösterir.


0

İşletme sınıfınız doğrudan kullanıcı arabiriminiz tarafından kullanılıyorsa, mantığı sahiplerine yaklaştırdığı için IDataErrorInfo kullanmak tercih edilir.

İşletme sınıfınız bir WCF / XmlWeb hizmetine referansla oluşturulmuş bir saplama sınıfı ise, IDataErrorInfo kullanamazsınız veya ExceptionValidationRule ile kullanım için Exception oluşturamazsınız / kullanmamalısınız. Bunun yerine şunları yapabilirsiniz:

  • Özel ValidationRule kullanın.
  • WPF UI projenizde kısmi bir sınıf tanımlayın ve IDataErrorInfo uygular.

1
Bunun eski olduğunu biliyorum, ama umarım Alex cevap verir. Vardığım sonuç da bu, ancak sorun şu ki (örneğin) ValidationRule'da 100'den büyük olmayan bir "Age" özelliği için bir doğrulama yazmanız, ardından aynı mantığı IDataErrorInfo arayüzünde tekrarlamanız gerekiyor. , mantığı kopyalar. Bunun herhangi bir yolu var mı?
JFTxJ

Mantığı nerede kopyalıyorsunuz? bir tür sunucu doğrulamasında? Yorumunuzdan kullanıcı arayüzünde IDataErrorInfo ile doğruladığınızı ve iş nesnesinde doğrulamayı çoğalttığınızı tahmin ediyorum, değil mi? Öyleyse, her iki tarafta da doğrulamak doğrudur. İş nesneleri kullanıcı arayüzlerine güvenemez ve kendi doğrulamasını gerçekleştirmelidir (yineleme gibi görünse de)
Alex Pollan

Hayır, doğrulama mantığının yinelenmesi IDataErrorInfo ve Özel Doğrulama Kuralındadır ... Özel Doğrulama Kuralı, verileri gerçekten bağlı nesneye güncellenmeden ÖNCE doğrulamanın tek yolu olduğundan, bu doğrulama (Yaş daha sonra 100) bir "alan başına" mesaj döndürmek için IDataErrorInfo'da tanımlanmalıdır, ancak Özel Doğrulama Kuralında da uygulanmalıdır. Mantıklı?
JFTxJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.