2013-02-19 90 views
6

में उपयोगकर्ता नियंत्रण में नियंत्रण पर सत्यापन सत्यापन टेम्पलेट दिखाएं WPF त्रुटि उपयोगकर्ता टेम्पलेट को WPC में UserControl के भीतर नियंत्रण में दिखाई देने के लिए कैसे मिलता है?डब्ल्यूपीएफ

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

उपयोगकर्ता नियंत्रण के नाम फ़ील्ड के लिए बाध्यकारी निम्नानुसार है।

<vc:MyUserControl ItemName="{Binding Model.Name, ValidatesOnDataErrors=True}" /> 

मेरे उपयोगकर्ता नियंत्रण और बैकिंग निर्भरताप्रॉपर्टी का एक अनुकरण संस्करण निम्नानुसार है।

<UserControl> 
    <Grid> 
     <TextBox Text="{Binding ItemName}" /> 
    </Grid> 
</UserControl> 

public partial class MyUserControl: UserControl 
{ 
    public static readonly DependencyProperty ItemNameProperty = 
     DependencyProperty.Register(
      "ItemName", 
      typeof(string), 
      typeof(MyUserControl), 
      new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 
} 

जानकारी मैं इस मुद्दे को अब तक सभी सिल्वरलाइट के संबंध में किया गया है से संबंधित या एक कनवर्टर का उपयोग कर लाल बॉर्डर (जो मेरे लिए कोई मतलब नहीं था) नहीं दिखाने के लिए मिल गया है। यह जानकारी यहां सब कुछ स्टैक ओवरफ्लो पर मिली थी।

क्या कोई भी इस समस्या को WPF के साथ हल करने में सक्षम है? क्या मैं कुछ स्पष्ट दिख रहा हूं?

+0

संबंधित प्रश्न [यहां] (http://stackoverflow.com/q/7808986/620360) और [यहां] (http://stackoverflow.com/q/1198342/620360) – LPL

+0

धन्यवाद, LPL। मैंने इस मुद्दे पर अपने शोध के दौरान इन दोनों सवालों को देखा था। दूसरे लिंक पर स्वीकृत उत्तर कनवर्टर का उपयोग है जिसे मैंने अपने प्रश्न में संदर्भित किया था। यह मेरे लिए काफी गलत लगता है। पहले प्रश्न में स्वीकृत उत्तर भी मेरे लिए काम नहीं कर रहा था। – CoderDawson

उत्तर

9

UserControl के लिए उपयोग किया जाएगा यदि UserControl पर बाइंडिंग ValidatesOnDataErrors=True का उपयोग करें। लेकिन आप Validation.ErrorTemplate Attached Property के साथ लाल सीमा को हटा सकते हैं।

आपके UserControl के भीतर सभी नियंत्रण केवल लाल सीमा दिखाएंगे यदि आप बैकिंग निर्भरता प्रॉपर्टीज के लिए IDataErrorInfo को लागू करके अपनी बाइंडिंग को मान्य करते हैं।

public class MyUserControl : UserControl, IDataErrorInfo 
{ 
    public static readonly DependencyProperty ItemNameProperty = 
     DependencyProperty.Register(
      "ItemName", 
      typeof(string), 
      typeof(MyUserControl), 
      new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 

    public string Error 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
     // use a specific validation or ask for UserControl Validation Error 
     return Validation.GetHasError(this) ? "UserControl has Error" : null; 
     } 
    } 
} 

और यहाँ सरलीकृत XAML

<UserControl Validation.ErrorTemplate="{x:Null}"> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"> 
     <TextBox Text="{Binding ItemName, ValidatesOnDataErrors=True}" /> 
    </Grid> 
</UserControl> 

अलावा

आप त्रुटियों आप अपने DependencyProperty के लिए BindingExpression हो और HasError Property जांच कर सकते हैं के बीच अंतर करना चाहते हैं।

BindingExpression be = BindingOperations.GetBindingExpression(this, ItemNameProperty); 
return be != null && be.HasError ? "ItemName has Error" : null; 
+0

फिर से धन्यवाद एलपीएल। मैंने मूल रूप से एक समान परिवर्तन का प्रयास किया था, लेकिन मैं यह निर्धारित करने में असमर्थ था कि UserControl में आंतरिक टेक्स्टबॉक्स में से कौन सा सत्यापन प्रमाणीकरण के रूप में त्रुटि हुई थी। टेक्स्टबॉक्स पर गेटहास त्रुटि हमेशा झूठी हो जाती है। मेरे UserControl के भीतर दो टेक्स्टबॉक्स के साथ वैसे भी यह निर्धारित करने के लिए कि कौन से बॉक्स में वास्तव में त्रुटि है? – CoderDawson

+0

यकीन नहीं है कि मैंने पहले क्या किया था लेकिन यह मेरे लिए काम करता प्रतीत होता है। मैं अभी भी नहीं देखता कि अद्वितीय टेक्स्टबॉक्स पर त्रुटियों के बीच अंतर कैसे करें, लेकिन इस बिंदु पर मुझे केवल उनमें से किसी एक पर सत्यापन होगा। धन्यवाद, एलपीएल! – CoderDawson

+1

मैंने उस पर त्रुटियों के बीच अंतर करने के लिए एक सुझाव जोड़ा है। ;) – LPL