2013-10-07 8 views
6

में सत्यापन त्रुटियां मेरे पास एक UserControl है जिसे हम विकसित किए जा रहे एक एप्लिकेशन में पुन: उपयोग किया जाएगा। हम एमवीवीएमलाइट के आधार पर एक ढांचा का उपयोग कर रहे हैं।एमवीवीएम और डेटा एन्नोटेशन के साथ डब्ल्यूपीएफ, उपयोगकर्ता नियंत्रण

सरलता के लिए कहते हैं कि उपयोगकर्ता नियंत्रण केवल एक पाठ बॉक्स होता है और एक निर्भरता संपत्ति "मात्रा" नाम को उजागर करता है की सुविधा देता है। उपयोगकर्ता नियंत्रण पर टेक्स्टबॉक्स निर्भरता संपत्ति "मात्रा" के लिए डेटाबेस है।

जब उपयोगकर्ता नियंत्रण के लिए एक दृश्य पर प्रयोग किया जाता है, usercontrol की "मात्रा" निर्भरता संपत्ति एक ViewModel में एक संपत्ति के लिए डेटाबाउंड है। (यह व्यूमोडेल एमवीवीएमएलएट व्यू मॉडेल लोकेटर के माध्यम से हमारे विचार का डाटाकॉन्टेक्स्ट है)।

यह सब बढ़िया काम करता है! बाइंडिंग काम करते हैं, गुण सेट होते हैं जैसे मैं उम्मीद करता हूं। सब ठीक है जब तक यह सत्यापन की बात आती है।

हम अपने ViewModel गुणों को सजाने के लिए DataAnnotations का उपयोग कर रहे हैं। ViewModel में INotifyDataErrorInfo का एक कस्टम कार्यान्वयन है। हमने नियंत्रण के चारों ओर एक लाल सीमा दिखाने के लिए अधिकांश इनपुट नियंत्रणों के लिए कस्टम शैलियों को लागू किया है, और सत्यापन त्रुटि संदेश प्रदर्शित करने वाले नियंत्रण के बगल में एक संदेश है। यह सब एक सामान्य मामले में महान काम करता है (उदाहरण के लिए एक दृश्य मॉडल में किसी संपत्ति के लिए एक दृश्य पर टेक्स्टबॉक्स)।

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

मैं समाधान के साथ उन सवालों का, इस समस्या के लिए stackoverflow पर खोज की है, कोई भी मेरी स्थिति के लिए काम करने के लिए लग रहे हैं।

मेरा पहला अनुमान है कि क्योंकि वास्तविक पाठ बॉक्स मेरे विचार मॉडल पर निर्भरता संपत्ति ही है और नहीं संपत्ति को सीधे ही है, तो इसे जनरेट त्रुटियों की ठीक से अधिसूचित नहीं किया जा रहा है। क्या उपयोगकर्ता नियंत्रण के माध्यम से और फिर टेक्स्टबॉक्स में व्यूमोडेल में उत्पन्न त्रुटियों को प्रसारित करने का कोई तरीका है?

कोई भी मदद या सुझाव जो आप दे सकते हैं, बहुत अच्छा होगा।

यहां UserControl xaml है।

<UserControl x:Class="SampleProject.UserControls.SampleControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" x:Name="sampleControl" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid x:Name="LayoutRoot" DataContext="{Binding ElementName=sampleControl}"> 
     <TextBox Text="{Binding Path=Quantity, ValidatesOnDataErrors=True}" Width="100" Height="30" /> 
</Grid> 
</UserControl> 

उपयोगकर्ता नियंत्रण कोड पीछे।

public partial class SampleControl : UserControl 
{ 
    public SampleControl() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty QuantityProperty = 
     DependencyProperty.Register("Quantity", typeof(int?), typeof(SampleControl), 
    new FrameworkPropertyMetadata{DefaultValue=null, BindsTwoWayByDefault = true}); 

    public int? Quantity 
    { 
     get { return (int?)GetValue(QuantityProperty); } 
     set { SetValue(QuantityProperty, value); } 
    } 
} 

एक दृश्य पर प्रयुक्त।

<userControls:SampleControl Grid.Row="1" Quantity="{Binding Path=Quantity, ValidatesOnDataErrors=True}" Height="60" Width="300"/> 

व्यूमोडेल संपत्ति।

[Required(ErrorMessage = "Is Required")] 
[Range(5, 10, ErrorMessage = "Must be greater than 5")] 
public int? Quantity 
{ 
    get { return _quantity; } 
    set { Set(() => Quantity, ref _quantity, value); } 
} 
private int? _quantity; 

(* नोट, सेटर में सेट विधि आधार viewmodel कि समर्थन संपत्ति सेट करता है और इसके लिए PropertyChanged घटना उठाती में सिर्फ एक सहायक विधि है।)

+0

जब कोड काम कर रहा है, तो त्रुटि संदेश उसी टेक्स्टबॉक्स पर दिखाई देता है? – Tico

+0

हां। यदि वह टेक्स्टबॉक्स स्वयं दृश्य पर था और सीधे ViewModel पर मात्रा गुण पर बाध्य था तो सत्यापन त्रुटि टेक्स्टबॉक्स पर दिखाई देती है। लेकिन जब टेक्स्टबॉक्स उपयोगकर्ता नियंत्रण में होता है और बाध्यकारी उपयोगकर्ता नियंत्रण की निर्भरता संपत्ति के माध्यम से जाता है, तो सत्यापन त्रुटि खो जाती है। – thornhill

+0

भले ही आप ब्रेकपॉइंट डाल दें? – Tico

उत्तर

0

से DataContext निकालने का प्रयास करें UserControl।इसके बजाय कि, वास्तविक संपत्ति को TextBox से Bind सीधे एक RelativeSourceBinding का उपयोग कर स्थापित करने की:

<TextBox Text="{Binding Quantity, RelativeSource={RelativeSource Mode=FindAncestor, 
    AncestorType={x:Type YourControlNamespace:SampleControl, 
    ValidatesOnDataErrors=True}}}" Width="100" Height="30" /> 

अद्यतन >>>

असफल कि, जब तक कि दृश्य मॉडल है कि इस संपत्ति के लिए बाध्य कर रहे हैं होगा हमेशा एक ही नाम से आबद्ध होने का एक गुण है, तो आप इस तरह माता-पिता की DataContext रों के माध्यम से खोज करने के लिए इस Binding प्राप्त कर सकते हैं:

<TextBox Text="{Binding Quantity, RelativeSource={RelativeSource Mode=FindAncestor, 
    AncestorLevel=2, ValidatesOnDataErrors=True}}}" Width="100" Height="30" /> 

आपको 2 को मूल तत्वों की सही संख्या होने के लिए TextBox सही संपत्ति तक पहुंच के साथ नियंत्रण तक पहुंचने से पहले बदलने की आवश्यकता होगी। उदाहरण के लिए, 2 के स्तर का उपयोग करने का अर्थ है कि फ्रेमवर्क के माता-पिता के मूल नियंत्रण के DataContext में Quantity से Bind नाम की एक संपत्ति खोजने का प्रयास करेगा। यह ट्रिकियर AncestorLevel के साथ काम कर रहा है हालांकि मुझे लगता है कि Grid एस जैसे 'छिपा' तत्व माता-पिता के रूप में शामिल नहीं हैं।

+0

नहीं, यह कुछ भी ठीक नहीं करता है। व्यवहार बिल्कुल वैसा ही है जैसा कि लेआउट रूट पर सेट किया गया है, और बाध्यकारी रिलेटिवसोर्स बाध्यकारी का उपयोग नहीं कर रहा है। – thornhill

+0

सुझाव के लिए धन्यवाद, यह काम करेगा, हालांकि मैं उपयोगकर्ता नियंत्रण पर डेटाकॉन्टेक्स्ट निर्दिष्ट नहीं करके रिश्तेदार स्रोत बाध्यकारी का उपयोग किए बिना ऊपर जो कुछ हासिल कर सकता हूं, वह माता-पिता डेटाकॉन्टेक्स्ट (जो मेरा व्यूमोडेल है) का वारिस करेगा। फिर नियंत्रण पर बाध्यकारी सिर्फ 'टेक्स्ट = "{बाध्यकारी मात्रा}' होना चाहिए। हालांकि, मैं इस नियंत्रण के उपयोगकर्ताओं को उनके व्यूमोडेल पर गुणों का नाम एक निश्चित तरीके से नामित करने के लिए मजबूर नहीं करना चाहूंगा ताकि वे यूआई घटक का उपयोग कर सकें। यह (http://goo.gl/zR2zN6) उपयोगकर्ता नियंत्रण बनाने के लिए एक पैटर्न है जो उस समस्या से बचाता है। – thornhill

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