के बजाय बाध्यकारी एक्सप्रेशन के साथ बुलाया जाता है, मैं अपने डब्ल्यूपीएफ एप्लिकेशन में सत्यापन प्रमाणीकरण का उपयोग करने के साथ शुरुआत कर रहा हूं, लेकिन काफी उलझन में हूं। इस प्रकारValidationStep = "UpdateValue" के साथ प्रमाणीकरण नियम को अद्यतन मूल्य
class RequiredRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (String.IsNullOrWhiteSpace(value as string))
{
return new ValidationResult(false, "Must not be empty");
}
else
{
return new ValidationResult(true, null);
}
}
}
XAML में प्रयुक्त:
<TextBox>
<TextBox.Text>
<Binding Path="Identity.Name">
<Binding.ValidationRules>
<validation:RequiredRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
यह ज्यादातर काम करता है के रूप में मैं उम्मीद करेंगे
मैं निम्नलिखित सरल नियम है। मुझे आश्चर्य हुआ कि मेरी स्रोत संपत्ति (Identity.Name
) सेट नहीं की जा रही थी; मेरे पास एक पूर्ववत कार्य है जो परिवर्तन को कभी नहीं देखता है, और इसे फिर से टाइप करने के अलावा मूल्य को वापस करने का कोई तरीका नहीं है (अच्छा नहीं)।
माइक्रोसॉफ्ट के Data Binding Overview नीचे के सत्यापन की प्रक्रिया का वर्णन करता है, जो इस व्यवहार को बहुत अच्छी तरह से बताता है। इस पर आधारित, मैं अपना ValidationStep
UpdatedValue
पर सेट करना चाहता हूं।
<validation:RequiredRule ValidationStep="UpdatedValue"/>
यह वह जगह है जहां चीजें मेरे लिए अजीब होती हैं। प्रमाणीकरण() को ऑब्जेक्ट वैल्यू के साथ बुलाया जाने वाला गुण मान सेट किया गया था (यानी, एक स्ट्रिंग), मुझे System.Windows.Data.BindingExpression
मिलता है! मुझे माइक्रोसॉफ्ट के दस्तावेज में कुछ भी नहीं दिख रहा है जो इस व्यवहार का वर्णन करता है।
डीबगर में, मैं स्रोत ऑब्जेक्ट (TextBox
का) देख सकता हूं, संपत्ति के पथ पर नेविगेट कर सकता हूं, और देख सकता हूं कि मान सेट किया गया है। हालांकि, मुझे सत्यापन नियम के भीतर सही संपत्ति पर जाने का कोई अच्छा तरीका नहीं दिख रहा है।
नोट: ValidationStep
ConvertedProposedValue
के रूप में के साथ, मैं में प्रवेश किया स्ट्रिंग (मैं उपयोग में एक कनवर्टर की जरूरत नहीं है) मिलता है, लेकिन यह भी मान्यता है, विफल रहता ब्लॉक स्रोत संपत्ति अद्यतन अपेक्षा के अनुरूप। CommittedValue
के साथ, मुझे स्ट्रिंग के बजाय BindingExpression
मिलता है।
यहाँ में कई प्रश्न हैं:
मैं() के लिए मान्य पारित किया जा रहा एक असंगत तर्क प्रकार ValidationStep सेटिंग के आधार पर क्यों मिलता है?
मैं बाइंडिंगएक्सप्रेस से वास्तविक मूल्य कैसे प्राप्त कर सकता हूं?
वैकल्पिक रूप से, क्या उपयोगकर्ता को टेक्स्टबॉक्स को पिछले (वैध) स्थिति में वापस करने की अनुमति देने का एक अच्छा तरीका है? अपने 2 सवाल का जवाब देने के लिए (मैं उल्लेख किया है, मेरे अपने पूर्ववत समारोह कभी नहीं परिवर्तन देखता है।)
मुझे आश्चर्य है कि कोई प्रतिक्रिया नहीं दिख रही है, खासकर जब से इसे हटा दिया गया है। मेरे लिए, यह ValidationRule दृष्टिकोण का उपयोग करने में एक शोस्टॉपर प्रतीत होता है, जो अन्यथा उत्कृष्ट और सहज दिखता है। क्या IDataErrorInfo का उपयोग करना बेहतर है, भले ही यह तुलना में गुंजाइश लगता है? – mbmcavoy