IDataErrorInfo :Не проверяющий входные данные
-
10-07-2019 - |
Вопрос
У меня есть пользовательский элемент управления, который содержит текстовое поле.У меня есть класс под названием 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.