Как установить значение по умолчанию, когда выдает ошибку, используя правила проверки?

Я использую правила проверки для отображения пользовательских сообщений и INotifyDataError для бизнес-правил.

Это одна часть моего кода:

public class ResponseValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int? response;
        bool noIllegalChars = TryParseStruct<int>(value.ToString(), out response);


        if (!noIllegalChars)
        {
            return new ValidationResult(false, "Input is not in a correct format.");
        }
        else
        {
            value = null;
            return new ValidationResult(true, null);
        }
    }

    ... 
}

Проверка предназначена для типа данных Nullable, я имею в виду, что значение может быть нулевым или целым числом, но не неверным вводом, например «5b».

Вопрос в том, когда он выдает эту ошибку (noIllegalChars = true), как я могу установить для свойства значение null?

РЕДАКТИРОВАТЬ: причина, по которой я это делаю, заключается в том, что когда пользователь оставил текстовое поле пустым (значение будет "") и технически, для свойства это нулевое значение, но он пытается установить "" для свойства.


person Darf Zon    schedule 25.01.2012    source источник


Ответы (3)


Технически — вы можете передать значение по ссылке:

public override ValidationResult Validate(ref object value, System.Globalization.CultureInfo cultureInfo)

Философски: вы хотите, чтобы правило проверки изменяло значение или просто уведомляло, что значение неверно? С точки зрения пользователя может раздражать, если я пытаюсь ввести какое-то значение, а система говорит мне, что оно недействительно, но не дает мне возможности исправить его, а только начинает заново.

Если код, запрашивающий проверку, хочет установить значение null, это ваш выбор:

int? result;
string input = "5b"

ValidationResult response = ResponseValidation().Validate(input, CultureInfo.CurrentCulture);
if (!response.IsValid) 
    result = null;
else
    result = int.Parse(input, CultureInfo.CurrentCulture);

Просто мои 2 цента...

person D Stanley    schedule 25.01.2012

Вы не можете, если значение не является параметром ссылки. Если вы пытаетесь отделить логику, решение о том, действительны ли данные, должно отличаться от того, что вы хотите сделать ПОСЛЕ этого решения, например, очистить поле ввода.

Например:

if (!rule.Validate(val, CultureInfo.CurrentCulture).IsValid)
{
    //Clear the field... whatever else you want to do
}
person Steven P    schedule 25.01.2012

В предыдущих ответах упоминалась передача значения в функцию проверки по ссылке - это не только семантически неверно, как они упоминают, но и если вы создаете перегруженную функцию Validate, которая делает это, то подсистема привязки не будет вызывать ее, если вы объявите правило проверки внутри XAML. Конечно, его можно вызвать программно, но вы выстрелите себе в ногу, если начнете создавать ValidationRules с кодом, доступ к которому можно получить только таким образом.

Более подходящим действием является использование преобразователя в поле, которое возвращает значение по умолчанию int?, если передается пустая строка.

person slugster    schedule 25.01.2012