WPF डेटा बाइंडिंग और वैलिडेशन रूल्स बेस्ट प्रैक्टिसेस


101

मेरे पास एक बहुत ही सरल WPF एप्लिकेशन है जिसमें मैं कुछ कस्टम सीएलआर वस्तुओं के संपादन की अनुमति देने के लिए डेटा बाइंडिंग का उपयोग कर रहा हूं। जब उपयोगकर्ता क्लिक पर बचत करता है तो मैं अब कुछ इनपुट सत्यापन करना चाहता हूं। हालाँकि, मैंने जो भी WPF पुस्तकें पढ़ी हैं, वे वास्तव में इस मुद्दे पर कोई स्थान नहीं देते हैं। मैं देखता हूं कि आप कस्टम वैलिडेशन रुल्स बना सकते हैं, लेकिन मैं सोच रहा हूं कि क्या यह मेरी जरूरतों के लिए ओवरकिल होगा।

तो मेरा सवाल यह है: क्या कहीं एक अच्छा नमूना अनुप्रयोग या लेख है जो WPF में उपयोगकर्ता इनपुट को मान्य करने के लिए सबसे अच्छा अभ्यास प्रदर्शित करता है?

जवाबों:


83

मुझे लगता है कि नया पसंदीदा तरीका IDataErrorInfo का उपयोग करना हो सकता है

और पढ़ें यहाँ


3
मैंने सिंच फ्रेमवर्क ( cinch.codeplex.com ) भी पाया है , जिसमें WPF + MVVM में सर्वोत्तम प्रथाओं के सत्यापन का डेमो शामिल है, और IDataErrorInfo
Mark Heath

3
.NET 4.5 में आप INotifyErrorInfo का उपयोग कर सकते हैं जो आपको केवल स्ट्रिंग्स के बजाय ऑब्जेक्ट वापस करने की अनुमति देता है।
पीटर

24

एमएस के पैटर्न और अभ्यास दस्तावेज से :

डेटा सत्यापन और त्रुटि रिपोर्टिंग

आपका डेटा मॉडल या मॉडल अक्सर डेटा सत्यापन करने और किसी भी डेटा सत्यापन त्रुटियों को देखने के लिए संकेत देने के लिए आवश्यक होगा ताकि उपयोगकर्ता उन्हें सही करने के लिए कार्य कर सके।

सिल्वरलाइट और WPF डेटा सत्यापन त्रुटियों के प्रबंधन के लिए सहायता प्रदान करते हैं जो व्यक्तिगत गुणों को बदलते समय होते हैं जो दृश्य में नियंत्रण के लिए बाध्य होते हैं। नियंत्रण के लिए डेटा-बाउंड होने वाले एकल गुणों के लिए, दृश्य मॉडल या मॉडल आने वाले खराब मान को अस्वीकार करके और अपवाद को फेंककर संपत्ति सेटर के भीतर डेटा सत्यापन त्रुटि का संकेत दे सकता है। यदि डेटा बाइंडिंग पर ValidatesOnException संपत्ति सत्य है, तो WPF और सिल्वरलाइट में डेटा बाइंडिंग इंजन अपवाद को हैंडल करेगा और उपयोगकर्ता को एक दृश्य क्यू प्रदर्शित करेगा कि डेटा सत्यापन त्रुटि है।

हालांकि, इस तरह से गुणों के साथ अपवादों को फेंकना संभव होने से बचा जाना चाहिए। एक वैकल्पिक तरीका यह है कि आप अपने व्यू मॉडल या मॉडल कक्षाओं पर IDataErrorInfo या INotifyDataErrorInfo इंटरफेस को लागू करें। ये इंटरफेस आपके दृश्य मॉडल या मॉडल को एक या अधिक संपत्ति मूल्यों के लिए डेटा सत्यापन करने और दृश्य में त्रुटि संदेश वापस करने की अनुमति देते हैं ताकि उपयोगकर्ता को त्रुटि के बारे में सूचित किया जा सके।

प्रलेखन यह बताता है कि IDataErrorInfo और INotifyDataErrorInfo को कैसे लागू किया जाए।


3
मुझे पहली बार में चिंता हुई जब मैंने थ्रो को एक अपवाद अनुशंसा के रूप में देखा। यह देखकर खुशी हुई कि "इस तरह से गुणों के साथ अपवादों को फेंकने से बचना चाहिए जहां संभव हो"
केनवरनर

22
यह भी ध्यान दिया जाना चाहिए कि microsoft में कुछ muppet ने INotifyDataErrorInfo को .net4 में शामिल नहीं करने का निर्णय लिया था लेकिन केवल सिल्वरलाइट में। इसका दर्द ..
aL3891

5
@ al3891- यह .NET 4.5- msdn.microsoft.com/en-us/library/…
:

@ aL3891 क्या लापता INotifyDataErrorInfo के लिए कोई विकल्प है?
AgentKnopf

10

वैयक्तिकता, मैं सत्यापन को संभालने के लिए अपवादों का उपयोग कर रहा हूं। इसके लिए निम्न चरणों की आवश्यकता है:

  1. आपके डेटा बाइंडिंग एक्सप्रेशन में, आपको "ValidatesOnException = True" जोड़ना होगा
  2. आप जिस डेटा ऑब्जेक्ट के साथ बाइंडिंग कर रहे हैं, उसमें आपको DependencyPropertyChanged हैंडलर जोड़ने की आवश्यकता है, जहाँ आप यह जाँचते हैं कि क्या नया मान आपकी शर्तों को पूरा करता है - यदि नहीं - आप ऑब्जेक्ट पुरानी वैल्यू (यदि आपको आवश्यक है) को पुनर्स्थापित करते हैं और आप अपवाद को फेंक देते हैं।
  3. नियंत्रण में अमान्य मान प्रदर्शित करने के लिए आपके द्वारा उपयोग किए जाने वाले नियंत्रण टेम्पलेट में, आप त्रुटि संग्रह तक पहुँच सकते हैं और अपवाद संदेश प्रदर्शित कर सकते हैं।

यहाँ चाल, केवल उन वस्तुओं के लिए बाध्य है, जो डिपेंडेंसीओबजेक्ट से प्राप्त होती है। INotifyPropertyChanged का सरल कार्यान्वयन काम नहीं करेगा - फ्रेमवर्क में एक बग है, जो आपको त्रुटि संग्रह तक पहुंचने से रोकता है।


3

इस लेख को भी देखें । माना जाता है कि Microsoft ने अपने एंटरप्राइज लाइब्रेरी (v4.0) को अपने पैटर्न और प्रथाओं से जारी किया, जहां वे सत्यापन विषय को कवर करते हैं, लेकिन भगवान जानते हैं कि उन्होंने WPF के लिए सत्यापन को शामिल क्यों नहीं किया है, इसलिए मैं जिस ब्लॉग पोस्ट पर आपको निर्देश दे रहा हूं, वह बताता है कि लेखक क्या है इसे अनुकूलित करने के लिए किया। उम्मीद है की यह मदद करेगा!


2

आपको WPF एप्लीकेशन फ्रेमवर्क (WAF) के बुकलायट्स सैंपल एप्लिकेशन में रुचि हो सकती है । यह दिखाता है कि WPF में सत्यापन का उपयोग कैसे करें और सत्यापन त्रुटियों के मौजूद होने पर सेव बटन को कैसे नियंत्रित करें।


0

यदि आपका व्यवसाय वर्ग सीधे आपके UI द्वारा उपयोग किया जाता है, तो IDataErrorInfo का उपयोग करना बेहतर होता है क्योंकि यह तर्क को उनके स्वामी के करीब रखता है।

यदि आपका व्यवसाय वर्ग WCF / XmlWeb सेवा के संदर्भ में बनाया गया एक स्टब वर्ग है तो आप IDataErrorInfo का उपयोग नहीं कर सकते हैं और न ही ExceptionValidationRule के साथ उपयोग के लिए अपवाद फेंक सकते हैं। इसके बजाय आप कर सकते हैं:

  • कस्टम ValidationRule का उपयोग करें।
  • अपने WPF UI प्रोजेक्ट में एक आंशिक वर्ग को परिभाषित करें और IDataErrorInfo को लागू करता है।

1
मुझे पता है कि यह पुराना है, लेकिन मुझे उम्मीद है कि एलेक्स जवाब देने में सक्षम होगा। यह निष्कर्ष मैं भी आया था, लेकिन समस्या यह है कि आपको (उदाहरण के लिए) "आयु" संपत्ति के लिए कुछ सत्यापन लिखना होगा जो बड़ा नहीं हो सकता था, फिर सत्यापन में 100, फिर IDatarrrorInfo इंटरफ़ेस में एक ही तर्क दोहराएं , जो तर्क की नकल करता है। क्या उसके आसपास कोई रास्ता है?
JFTxJ

आप तर्क की नकल कहां करते हैं? सर्वर सत्यापन के किसी प्रकार में? मैं आपकी टिप्पणी से अनुमान लगाता हूं कि आप UI में IDataErrorInfo के साथ सत्यापन कर रहे हैं और व्यवसाय की वस्तु में सत्यापन की नकल कर रहे हैं, नहीं? यदि ऐसा है, तो दोनों पक्षों में मान्य करना सही है। व्यवसाय की वस्तुएं UI पर भरोसा नहीं कर सकती हैं और उसे अपना सत्यापन करना चाहिए (हालांकि यह दोहराव लगता है)
एलेक्स पोलन

नहीं, सत्यापन तर्क का दोहराव IDataErrorInfo में और कस्टम सत्यापन नियम में है ... चूंकि कस्टम सत्यापन नियम डेटा को मान्य करने का एकमात्र तरीका है, क्योंकि यह वास्तव में बाध्य ऑब्जेक्ट के लिए अद्यतन किया गया है, इसलिए सत्यापन (आयु कम होना चाहिए) तब 100) को "प्रति क्षेत्र" संदेश लौटाने के लिए IDataErrorInfo में परिभाषित करने की आवश्यकता है, लेकिन कस्टम सत्यापन नियम में भी इसे लागू किया जाना चाहिए। समझ में आता है?
JFTxJ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.