#c# #wpf #validation #mvvm
#c# #wpf #проверка #mvvm
Вопрос:
Итак, у меня есть приложение WPF (с использованием MVVM), состоящее из представления, в котором есть два текстовых поля: имя и фамилия.
Оба они должны состоять только из букв. Я добился этого, используя атрибуты для соответствующего объекта (Worker):
[RegularExpression(@"^[a-zA-Z] $", ErrorMessage = "First Name must consist of letters only.")]
public string FirstName
[RegularExpression(@"^[a-zA-Z] $", ErrorMessage = "Last Name must consist of letters only.")]
public string LastName
И это отлично работает. Но…Мне также нужно иметь следующее правило проверки:
По крайней мере, одно из полей: FirstName или LastName должно быть заполнено.
Есть идеи о том, как реализовать проверку с участием двух полей?
Ожидаемый результат: если ни одно из полей не заполнено, рядом с текстовым полем FirstName появится сообщение о проверке: должно быть заполнено хотя бы имя или фамилия. Такое же сообщение также появится рядом с текстовым полем «Последнее имя». Как только я заполню одно из этих полей, оба сообщения исчезнут.
Еще одна проблема заключается в том, что если я ввожу цифру в текстовое поле «Имя», я хочу, чтобы сообщение об ошибке отображалось только в текстовом поле «Имя»: имя должно состоять только из букв. И я хочу, чтобы ошибка хотя бы одного из полей должна быть заполнена (рядом с обоими текстовыми полями), чтобы исчезнуть.
Спасибо!
Комментарии:
1. Прочитайте также эту замечательную статью о проверке WPF. msdn.microsoft.com/en-us/magazine/ff714593.aspx
Ответ №1:
Вам было бы лучше реализовать IDataErrorInfo
интерфейс или, если вы используете .NET 4.5, более новый INotifyDataErrorInfo
интерфейс. Используя IDataErrorInfo
интерфейс в качестве примера, вам нужно будет реализовать индексатор для вашего класса типов данных, а в индексаторе вы можете определить любые сложные правила, которые вы можете придумать:
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if ((propertyName == "FirstName" || propertyName == "LastName") amp;amp;
(FirstName == string.Empty || LastName == string.Empty))
error = "You must enter either the First Name or Last Name fields.";
return error;
}
}
Комментарии:
1. Спасибо, я успешно выполнил это с помощью интерфейса INotifyDataErrorInfo.
Ответ №2:
Один из способов — написать свои собственные пользовательские атрибуты проверки… это не слишком сложно.. я создал пару пользовательских атрибутов проверки для значений «Меньше» и «Больше», которые включают в себя два поля… вы можете изменить их для проверки вашей фамилии и имени, что намного проще по сравнению с «Меньше» и «Больше».
вот ссылка
http://bathinenivenkatesh.blogspot.co.uk/2011/09/custom-validation-attributes.html