2010-06-24 4 views
8

मैं वर्तमान में अपने डब्ल्यूपीएफ ऐप के लिए सत्यापन की तलाश में हूं और IDataErrorInfo का उल्लेख देखा है। हालांकि इसका उपयोग करने के लिए कुछ गाइड हैं और इससे भी बदतर कोई भी नहीं है जो यह बताता है कि यह कैसे काम करता है।IDataErrorInfo कैसे काम करता है?

MSND.com साइट पर इस दूँगा है ' MSDN

public class Person : IDataErrorInfo 
{ 
    private int age; 
    public int Age 
    { 
     get { return age; } 
     set { age = value; } 
    } 

    public string Error 
    { 
     get 
     { 
      return null; 
     } 
    } 

    public string this[string name] 
    { 
     get 
     { 
      string result = null; 
      if (name == "Age") 
      { 
       if (this.age < 0 || this.age > 150) 
       { 
        result = "Age must not be less than 0 or greater than 150."; 
       } 
      } 
      return result; 
     } 
    } 
} 

मैं देख रहा हूँ यहाँ क्या हो रहा है, लेकिन मैं पता नहीं क्या यह वास्तव में अपने डेटा के लिए करता है।

उन 2 गुणों का उपयोग कब किया जाता है? मान लीजिए कि कोई Age 400 के रूप में सेट करता है: संपत्ति पर सेटटर कहा जाता है। क्या त्रुटि चीज इसे सेट होने से रोक देगी? यदि नहीं और यह केवल चेतावनी देता है कि संख्या गलत है, तो किसी को जानकारी को सहेजने से रोकने के लिए क्या है? जांच करने के लिए IsValid() विधि नहीं है, है ना?

यह जानना अच्छा लगेगा कि पर्दे के पीछे क्या होता है।

उत्तर

6

Error संपत्ति का आमतौर पर उपयोग नहीं किया जाता है, लेकिन आपको इंटरफ़ेस को लागू करने के लिए इसे परिभाषित करना होगा। जैसा कि रीसाइक्लिंग ने कहा था, प्रमाणीकरण संपत्ति को गलत मान के साथ सेट करने से नहीं रोकेगा, लेकिन आप संपत्ति को डिफ़ॉल्ट मान पर सेट कर सकते हैं। मुझे आपको दिखाएं कि मैं इसका उपयोग कैसे कर रहा हूं। मेरे पास TextBox es है जो मुझे उनके मानों को मान्य करना है। जब सेट कहा जाता है तो त्रुटि के साथ एक संदेश बॉक्स दिखाने के बजाय, मैं 'वेबली' दृष्टिकोण लेना चाहता हूं: मैं TextBox की सीमा और पृष्ठभूमि को अमान्य मान सेट करते समय लाल होने के लिए और TextBox की टूलटिप चाहता हूं यह त्रुटि दिखाओ।

<converters:ValidationConverter x:Key="validationConverter"/> 
<Style x:Key="TestStepTextBox" TargetType="{x:Type TextBox}"> 
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBox}"> 
       <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> 
        <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="Validation.HasError" Value="true"> 
         <Setter Property="ToolTip" 
           Value="{Binding RelativeSource={RelativeSource Self}, 
           Converter={StaticResource validationConverter}, Path=(Validation.Errors)}"/> 
         <Setter Property="Background" Value="#33FF342D"/> 
         <Setter Property="BorderBrush" Value="#AAFF342D"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<TextBox Name="txtRunAfter" Text="{Binding RunAfter, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource TestStepTextBox}"/> 
<TextBox Name="txtStopAfter" Text="{Binding StopAfter, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource TestStepTextBox}"/> 

एक बहुत महत्वपूर्ण नोट कनवर्टर के बारे में:

इस टेक्स्ट बॉक्स मेरी XAML है। जब मैंने एक अवैध मान दर्ज किया तो मुझे अपवाद मिल रहा था और फिर मैंने एक अच्छा मूल्य निर्धारित किया। किसी भी तरह, शायद UpdateSourceTrigger=PropertyChanged होने से संबंधित, एक समय था जब HasError संपत्ति सत्य थी लेकिन कोई त्रुटि सेट नहीं था (link देखें)। तो यहाँ कन्वर्टर के लिए कोड है:

public class ValidationConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ReadOnlyObservableCollection<ValidationError> errors = value as ReadOnlyObservableCollection<ValidationError>; 
     if (errors == null) return value; 
     if (errors.Count > 0) 
     { 
      return errors[0].ErrorContent; 
     } 
     return ""; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("This method should never be called"); 
    } 
} 

अपने मॉडल परत में सहेजा जा रहा मैं अगर मैं मॉडल के लिए डेटा के लिए प्रतिबद्ध होना चाहिए जाँच करने के लिए एक ही विधि का उपयोग कर रहा हूँ से invaled मूल्य को रोकने के लिए। यदि मान अमान्य है तो मैंने केवल संपत्ति निर्धारित की है और मॉडल में संपत्ति का एक सेट नहीं बुलाया है। कोड की जाँच करें:

private int _runAfter = 0; 
public int RunAfter 
{ 
    get 
    { 
     return _runAfter; 
    } 

    set 
    { 
     if (_runAfter != value) 
     { 
      _runAfter = value; 
      OnPropertyChanged("RunAfter"); 

      if (validateRunAfter() == null) 
       setRunAfter(); //sets the property value to the model layer 
     } 
    } 
} 

string IDataErrorInfo.this[string columnName] 
{ 
    get 
    { 
     string message = null; 
     if (columnName == "RunAfter") 
      message = validateRunAfter(); 
     //... 
     return message; 
    } 
} 

private string validateRunAfter() 
{ 
    if (value >= _order) 
     return "Run After value must be less than its Step Order (#) value."; 

    return null; 
} 
+0

मान्य करने के साथ, मेरे पास सही तरीके से यह जांचने का समय नहीं है लेकिन आपको सही उत्तर देगा अगर यह सब अच्छा है;) –

2

मुझे IDataErrorInfo के बारे में पता है, यह केवल UI प्रयोजनों के लिए उपयोग किया जाता है। यह क्या करता है त्रुटि संदेश (ओं) को WPF UI पर बांधने का एक आसान तरीका प्रदान करता है। चूंकि WPF UIIDataErrorInfo को INotifyPropertyChanged जैसी क्रियाओं को "पहचानता" है, तो आपको UI में त्रुटि संदेशों को दिखाने के लिए अतिरिक्त कोड लिखने की आवश्यकता नहीं है।

एक और बात, यह गलत मूल्य निर्धारित करने से नहीं रुक जाएगी। यह सिर्फ WPF UI बताएगा (जब WPF UI इंडेक्सर संपत्ति नाम की आपूर्ति करता है) कि एक विशिष्ट संपत्ति में मान मान्य नहीं है।

+0

इस में जोड़े, IDataErrorInfo रूप में अच्छी तरह ASP.NET MVC यूआई पर लागू होता है, के रूप में यह से System.ComponentModel http: //www.asp।नेट/एमवीसी/ट्यूटोरियल/पुराने संस्करण/मॉडल- (डेटा)/idaterrorinfo-interface-cs – Sai

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

  • कोई संबंधित समस्या नहीं^_^