Frage

Ich habe eine Benutzersteuerung, die ein Textfeld enthält. Ich habe eine Klasse namens Person, die IDataErrorInfo Schnittstelle implementiert:

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 setzt die Usercontrol eine Methode namens SetSource, durch die der Code die Bindung setzt:

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 dem Benutzer die Kontrolle enthält den 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);
        }
    }

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

War es hilfreich?

Lösung

Ihre Age Klasse müssen IDataErrorInfo implementieren. Ihre Person Klasse wird nicht aufgefordert, die Age Eigenschaften zu bestätigen.

Wenn das nicht möglich ist, habe ich ein Validierungssystem für WPF, die erweiterbar genug ist, um dies zu unterstützen. Die URL lautet hier:

In der ZIP ist ein Dokument Wort beschreibt es.

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

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);
    }
}

Auch auf diesen Link finden Sie unter:

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

Andere Tipps

könnte eine weitere Option sein IDataErrorInfo auf die Altersklasse zu implementieren und ein Ereignis auf es wie OnValidationRequested erstellen, die von der Klasse Person erfasst werden sollten. Auf diese Weise könnten Sie die Age Feld validieren basierend auf anderen Eigenschaften der Klasse Person.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top