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

Я использую правила проверки для отображения пользовательских сообщений и 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?

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

Ответы [ 3 ]

1 голос
/ 25 января 2012

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

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 цента ...

0 голосов
/ 26 января 2012

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

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

0 голосов
/ 25 января 2012

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

Например:

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