Комплексная проверка WPF

#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