2011-12-06 11 views
5

मुझे एकाधिक फ़ील्ड के बीच सत्यापन के साथ समस्या मिली है। उदाहरण के लिए - मुझे RangeDateViewModel नामक एक व्यूमोडेल मिला जिसमें दिनांक दृश्य दृश्य नामक कक्षा के 2 उदाहरण शामिल हैं, उनमें से प्रत्येक क्रमशः प्रारंभ तिथि और समाप्ति तिथि का प्रतिनिधित्व करता है।विभिन्न स्तरों में एकाधिक फ़ील्ड के बीच सत्यापन

तो मेरी इस तरह बाध्यकारी दिखता है -

<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}"> 
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}"> 

मेरे RangeDateViewModel वर्ग IDataErrorInfo इंटरफ़ेस लागू करता है। मेरी योजना में, RangeDateViewModel को मान्य होता है कि आरंभ तिथि समाप्ति तिथि से पहले, इस तरह IDataErrorInfo [ "PROPERTYNAME"] में समारोह मान्यता तर्क लगाने से है -

public string this[string columnName] 
    { 
     get 
     { 
      return ValidationError(); 
     } 
    } 

समस्या यह है कि यह कभी है कहा जा रहा है, और इसके बजाय IDataErrorInfo गुण जो प्रत्येक दिनांक दृश्य मॉड्यूल कक्षाओं में रहते हैं, इसके बजाय कहा जा रहा है।

मुझे लगता है कि यह इसलिए है क्योंकि बाध्य संपत्ति RangeDateViewModel के समान स्तर पर नहीं है, बल्कि इसके बजाय बच्चे DateViewModel के अंदर है।

मुझे लगता है कि मेरी ज़रूरत काफी बुनियादी है और इस समस्या के लिए एक आसान समाधान होना चाहिए। मैंने IDataErrorInfo के बजाय प्रमाणीकरण नियमों का उपयोग करने का प्रयास किया लेकिन फिर मैं ValidationRules से वर्तमान सत्यापन स्थिति के बारे में ViewModel को सूचित करने में समस्याएं उत्पन्न करूंगा।

उत्तर

1

निम्नलिखित दृष्टिकोण का उपयोग कर प्रयास करें:

<DataTemplate DataType="{x:Type ViewModels:DateViewModel}"> 
    <TextBox Text="{Binding Date}"> 
</DataTemplate> 
  • बाइंड एक ContentControl को यह ViewModel के उदाहरण और उस बंधन पर true को ValidateOnDataError सेट:

    1. एक DataTemplateDateViewModel के लिए बनाएं

      <ContentControl Content="{Binding StartDate, ValidateOnDataError=True}" /> 
      <ContentControl Content="{Binding EndDate, ValidateOnDataError=True}" /> 
      
    2. RangeDateViewModel में StartDate और EndDate और की PropertyChanged घटना की सदस्यता जब उठाया, StartDate/EndDate के साथ एक PropertyChanged ईवेंट उत्पन्न:

      StartDate.PropertyChanged += (s, e) => InvokePropertyChanged("StartDate"); 
      EndDate.PropertyChanged += (s, e) => InvokePropertyChanged("EndDate"); 
      
  • +0

    धन्यवाद डैनियल! मैंने कोशिश की कि आपने जो सुझाव दिया था लेकिन स्पष्ट रूप से यह अभी भी पर्याप्त नहीं है। IDataErrorInfo संपत्ति वास्तव में उपयोग की जा रही है लेकिन केवल टेम्पलेट के प्रारंभ में, और बाद में नहीं जब वास्तविक डेटा बदल जाता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि स्टार्टडेट और एंडडेट जटिल वस्तु हैं कि वे स्वयं नहीं बदला जा रहे हैं, लेकिन उनके अंदर गुण हैं, और यह संपत्तिChanged बढ़ाने के लिए पर्याप्त नहीं है। शायद मुझे किसी भी तरह की घटना को उठाना चाहिए जब आंतरिक दिनांक गुण बदलते हैं? – Dror

    +0

    @ डोर: आप सही हैं। अद्यतन उत्तर में चरण तीन देखें। –

    +0

    धन्यवाद डैनियल! यह काम करता है हालांकि मेरे पास अभी भी एक आखिरी मामूली समस्या है जिसका सामना कर रहा हूं। इस समाधान के साथ परिणाम मान अमान्य होने पर लाल रंग में चिह्नित दो नियंत्रण होते हैं। मैं चाहता हूं कि उनके बजाय लाल रंग में चिह्नित किया जा रहा है, स्टैपपनेल जो इन दो क्षेत्रों को रखता है, को पढ़ने में चिह्नित किया जाएगा। अधिमानतः इन दो क्षेत्रों को चिह्नित नहीं किया जाएगा, लेकिन यह जरूरी नहीं है। मैंने "हैसइरर्स" नामक रेंजडेट व्यू मॉडेल पर एक बूल प्रॉपर्टी पर डेटा ट्रिगर लगाने का प्रयास किया जो "सत्यापन। हैसरर" को सही पर सेट करेगा, लेकिन दुर्भाग्यवश यह केवल पढ़ने वाली संपत्ति है। मुझे उम्मीद है कि आप इस मुद्दे के साथ भी मेरी मदद कर सकते हैं। – Dror

    1

    मैं समस्या यह है कि public string this[string columnName] बस सिर्फ अन्य आमंत्रित नहीं किया गया था सप्ताह।

    समाधान सरल था। बाध्यकारी WPF बाइंडिंग इंजन मेरे व्यू मॉडल्स के घोंसले का पालन नहीं कर सका।

    मैं मान लिया था कि मैं ViewModel में संपत्ति वर्तमान DataContext है कि लागू करने की जरूरत है, लेकिन बजाय यह ViewModel कि है नियंत्रण करने के लिए बाध्य में लागू किया जाना चाहिए।

    उदाहरण:

    <TextBox Text="{Binding Path=ProductViewModel.DescriptionViewModel.ProductName, 
                Mode=TwoWay, 
                ValidatesOnDataErrors=True, 
                NotifyOnValidationError=True}" /> 
    

    यहाँ DescriptionViewModel वर्ग कि बाध्य प्रॉपर्टी वाला है।IDataErrorInfo को उस कक्षा में लागू करने की आवश्यकता है (ProductViewModel या किसी अन्य श्रेणी में पदानुक्रम जो इसे शामिल कर सकता है) तो सब कुछ ठीक काम करेगा।

    +0

    हाय सेंसी, आपकी टिप्पणी के लिए धन्यवाद। मुझे पता है कि बाध्यकारी पदानुक्रम में निचले वर्ग में लागू होने पर IDataErrorInfo ठीक काम कर रहा है, लेकिन मुझे इसके साथ 2 समस्याएं मिलीं। 1 - मैं मान्यता तर्क में शामिल दो वर्गों मिल गया है, लेकिन इन निचले स्तर वर्गों में से प्रत्येक एक दूसरे को पता नहीं है। 2 - मैं नहीं चाहता कि यदि फ़ील्ड अमान्य है तो फ़ील्ड में से केवल एक को लाल रंग में चिह्नित किया जाना चाहिए। मैं चाहता हूं कि पूरा नियंत्रण लाल रंग में चिह्नित हो। – Dror

    संबंधित मुद्दे