2011-09-05 10 views
5

मैं नियंत्रण thats है पाठ बॉक्सValidationRules

public class MyTextBox : TextBox 

यह एक शैली है से विरासत

<Style TargetType="{x:Type Controls:MyTextBox}"> 

setters की

<Setter Property="Template"> 

है मैं करने में सक्षम होना चाहता हूँ टेम्पलेट में Binding.ValidationRules को सेट करें, इस प्रकार इस प्रकार के टेक्स्टब के सभी उदाहरणों को प्रभावित करें बैल। इसलिए मैं टाइम्स, तिथियां, संख्याशास्त्र, पोस्ट/ज़िप कोड कहने के लिए टेक्स्टबॉक्स बना सकता हूं .. या जो कुछ भी मैं चाहता हूं,

हर बार जब मैं टेक्स्टबॉक्स बनाता हूं तो मैं सत्यापन नियम सेट नहीं करना चाहता हूं। मैं बस कहना चाहता हूं कि मैं NumericTextBox चाहता हूं और इसे टेम्पलेट में सेट किए गए किसी भी तरीके से मान्य कर दूं।

क्या यह संभव है?

मैंने अभी तक देखा है कि नियंत्रण के प्रत्येक उदाहरण पर प्रमाणीकरण नियम सेट किए जा रहे हैं उदा।

<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}> 
<TextBox.Text> 
    <Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" > 
     <Binding.ValidationRules> 
      <local:RegexValidationRule Pattern="{StaticResource emailRegex}"/> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 

(http://www.wpftutorial.net/DataValidation.html से)

उत्तर

1

मुझे यकीन नहीं है कि आप जो चाहते हैं उसे करना संभव है। आप संपत्ति सेटर्स में बहुत सी चालबाजी के साथ ऐसा करने में सक्षम हो सकते हैं (मैं इस पर भरोसा नहीं करता, क्योंकि इसमें बाइंडिंग को संशोधित करना शामिल होगा, जो परिभाषा गतिशील हैं), या कोड/कस्टम नियंत्रण के पीछे कोड के साथ।

इसके बजाय मेरा सुझाव है कि आप अपने सत्यापन को अपने व्यूमोडेल में धक्का दें, शायद IDataErrorInfo के साथ। वहां कई लेख हैं।

MVVM - Validation

ऐसा करने से आप मानक OO रचना तकनीक का उपयोग करने की अनुमति देगा, तो आप कर सकते हैं avoid repeating yourself :)

+0

मुझे लगता है कि मैं इस दृष्टिकोण को जाने दूंगा –

4

जैसा कि आप देख, सत्यापन नियमों बाइंडिंग के साथ स्थापित कर रहे हैं। मैं एक ही समस्या में आए और मेरे लिए काम कर समाधान इस तरह कुछ करने के लिए किया गया था:

public MyTextBox() 
    {    
     this.Loaded += new RoutedEventHandler(MyTextBox_Loaded); 
    } 

    void MyTextBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty); 
     binding.ValidationRules.Add(new MyValidationRule()); 
    } 

समस्या यहाँ यह सुनिश्चित करें कि बाध्यकारी इसलिए लोडेड का उपयोग करने से पहले हम सत्यापन नियम जोड़ने के लिए निर्धारित है, हो रहा है , लेकिन मुझे यकीन नहीं है कि यह हर परिदृश्य पर काम करेगा या नहीं।

+0

हम्म: यहाँ सबसे पहले मैं "MVVM सत्यापन" के लिए अभी-अभी एक खोज के साथ पाया में से एक है । ठीक है। तो यह एमवीवीएम के साथ कैसे फिट है। क्या हमें कोड में इस बाध्यकारी और सत्यापन कनेक्शन को डालना चाहिए? क्या यह xaml पर प्रत्येक बंधन करने के लिए उतना आसान/कठिन होगा और जिस तरह से मैंने कल्पना की थी उसमें templating भूल जाओ? –

+0

यह दृष्टिकोण आर्किटेक्चर अज्ञेयवादी है, और सामान्य सत्यापन के लिए उपयोग किया जाना है, अन्यथा मुझे टेक्स्टबॉक्स से विरासत में प्राप्त एक नई कक्षा बनाने का बिंदु नहीं दिखाई देता है। आपके उदाहरण में आपको एक वैध ईमेल की जांच करने की आवश्यकता है। यदि आपको ऐप विशिष्ट डेटा सत्यापन की आवश्यकता है, तो आपको हमेशा IDataErrorInfo के साथ जाना चाहिए। – Natxo

+0

हां, मुझे लगता है कि उपयोगकर्ता नियंत्रण के साथ कोड के पीछे कोड होना ठीक है। इसका एक उपयोगकर्ता नियंत्रण है, यह एक विशिष्ट नौकरी करता है और यह सुनिश्चित कर सकता है कि उसका डेटा मान्य है। –