Вопрос

У меня есть пользовательский элемент управления, который содержит текстовое поле.У меня есть класс под названием Person, который реализует интерфейс IDataErrorInfo:

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
}

Теперь usercontrol предоставляет метод с именем setSource, с помощью которого код устанавливает привязку:

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

Окно WPF, которое включает в себя пользовательский элемент управления, имеет следующий код:

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

Учитывая этот код, привязка работает нормально, но проверка никогда не запускается.Что не так с этим кодом?

Это было полезно?

Решение

Ваш Age классу необходимо будет реализовать IDataErrorInfo.Ваш Person классу не будет предложено подтвердить Ageего свойства.

Если это не вариант, я написал систему проверки для WPF, которая достаточно расширяема, чтобы поддерживать это.URL-адрес находится здесь:

В ZIP-файле есть документ Word, описывающий это.

Редактировать:вот один из способов, которым age мог бы реализовать IDataErrorInfo, не будучи слишком умным:

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

Также смотрите эту ссылку:

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

Другие советы

Другой вариант может заключаться в реализации IDataErrorInfo в классе Age и создании в нем события, такого как OnValidationRequested , которое должно быть захвачено классом Person. Таким образом, вы можете проверить поле Age на основе других свойств класса Person.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top