2009-03-11 1 views
1

Ich habe ein Benutzersteuerelement, das eine Textbox enthält. Ich habe eine Klasse namens Person, die implementiert IDataErrorInfo Schnittstelle:IDataErrorInfo: Eingabe nicht validieren

public partial class TxtUserControl : UserControl 
    {   
     private Binding _binding; 

     public void SetSource(string path,Object source) 
     { 
      _binding = new Binding(path); 
      _binding.Source = source; 
      ValidationRule rule; 
      rule = new DataErrorValidationRule(); 
      rule.ValidatesOnTargetUpdated = true;    
      _binding.ValidationRules.Add(rule); 
      _binding.ValidatesOnDataErrors = true; 
      _binding.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus; 
      _binding.NotifyOnValidationError = true;    
      _binding.ValidatesOnExceptions = true; 
      txtNumeric.SetBinding(TextBox.TextProperty, _binding);     
     } 
... 
} 

Das WPF-Fenster, das die Steuer Benutzer umfasst hat:

class Person : IDataErrorInfo 
{ 
private bool hasErrors = false; 
#region IDataErrorInfo Members 

     public string Error 
     {    
      get 
      { 
       string error = null; 
       if (hasErrors) 
       { 
        error = "xxThe form contains one or more validation errors"; 
       } 
       return error; 
      } 
     } 

     public string this[string columnName] 
     { 
      get 
      { 
       return DoValidation(columnName); 
      } 
     } 
     #endregion 
} 

Nun ist die Usercontrol ein Verfahren SetSource, durch die der Code wird die Bindung genannt aussetzt Mit dem folgenden Code:

public SampleWindow() 
    { 
     person= new Person(); 
     person.Age = new Age(); 
     person.Age.Value = 28; 

     numericAdmins.SetSource("Age.Value", person); 
    } 
    private void btnOk_Click(object sender, RoutedEventArgs e) 
    {   

     if(!String.IsNullOrEmpty(person.Error)) 
     { 
      MessageBox.Show("Error: "+person.Error); 
     } 
    } 

dieser Code gegeben, die Bindung funktioniert gut, aber die Validierung wird nie ausgelöst. Was ist mit diesem Code falsch?

Antwort

3

Ihre Klasse Age muss IDataErrorInfo implementieren. Ihre Person Klasse wird nicht aufgefordert, die Age Eigenschaften zu überprüfen.

Wenn das keine Option ist, schrieb ich ein Validierungssystem für WPF, das erweiterbar genug ist, um dies zu unterstützen. Die URL lautet hier:

Im ZIP ein Word-Dokument ist es beschreibt.

Edit: hier ist ein Weg, Alter IDataErrorInfo, ohne zu intelligent umsetzen könnte:

class Constraint 
{ 
    public string Message { get; set; } 
    public Func<bool> Validate; 
    public string Name { get; set; } 
} 

class Age : IDataErrorInfo 
{ 
    private readonly List<Constraint> _constraints = new List<Constraint>(); 

    public string this[string columnName] 
    { 
     get 
     { 
      var constraint = _constrains.Where(c => c.Name == columnName).FirstOrDefault(); 
      if (constraint != null) 
      { 
       if (!constraint.Validate()) 
       { 
        return constraint.Message; 
       } 
      } 
      return string.Empty; 
     } 
    } 
} 

class Person 
{ 
    private Age _age; 

    public Person() 
    { 
     _age = new Age(
      new Constraint("Value", "Value must be greater than 28",() => Age > 28); 
    } 
} 

Siehe auch diesen Link:

http://www.codeproject.com/KB/cs/DelegateBusinessObjects.aspx

+0

Paul, Ich habe mir das von Ihnen entwickelte Framework angesehen. Gibt es einen anderen Weg, dies zu tun? Wenn Sie hier einige Hinweise geben könnten, wäre es großartig. – Ngm

+0

Lassen Sie Age IDataErrorInfo implementieren oder verwenden Sie eine WPF ValidationRule (Validierung auf der Benutzerebene) - dies sind die einzigen Problemumgehungen, die ich mir vorstellen kann. –

+0

Mit meinem Validierungsframework würden Sie einfach das UI-Steuerelement mit einem Regelnamen (z. B. "AgeValue") verknüpfen und in Ihrer IDataErrorInfo würden Sie die Validierung der Regel "AgeValue" durchführen. In meinem Framework gibt es keine Kopplung zwischen Eigenschaftsnamen und Validierungsregelnamen, wie es bei der WPF-Validierung der Fall ist. –

0

Eine weitere Option könnte IDataErrorInfo auf die Altersklasse zu implementieren und erstellen Sie ein Ereignis wie OnValidationRequested darauf, das von der Klasse Person erfasst werden sollte. Auf diese Weise können Sie das Feld Alter anhand anderer Eigenschaften der Klasse Person validieren.