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

Я пытаюсь выполнить проверку свойства. У нас есть свойство обнуляемое:

    public int? Number
    {
        get { return _number; }
        set
        {
            if (_number != value)
            {
                _number = value;
                RaisePropertyChanged("Number");
            }
        }
    }

И это свойство привязано к текстовому полю. Я только хочу проверить эти два сценария:

  • Представьте, что пользователь оставил текстовое поле пустым (textbox.text = ""), поэтому свойство Number должно получить нулевое значение (вместо "").
  • И если пользователь вводит «2b», свойство Number должно иметь нулевое значение (потому что это ошибка), но в текстовом поле все равно должно быть «2b».

Полагаю, IDataNotifyError и ValidationRules не работают для этого. Как я могу разрешить эти ситуации?

РЕДАКТИРОВАТЬ: я также использую ValidationRule, чтобы показать пользовательское сообщение, когда пользователь вводит неправильный формат. Но когда это происходит, свойство не срабатывает до нуля. И если в этой ошибке указано значение true, оно сработало, но не отображает сообщение об ошибке.

                 <TextBox.Text>
                    <Binding Path="Number" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnExceptions="True" NotifyOnValidationError="True" Converter="{x:Static c:IntConverter.Default}" >
                        <Binding.ValidationRules>
                                <r:NumericValidation />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>

Правило проверки

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

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

    ...
}

Ответы [ 3 ]

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

Попробуйте следующий конвертер:

public class IntConverter : IValueConverter
{
    public object Convert(object value,
                          Type targetType,
                          object parameter,
                          CultureInfo culture)
    {
        if (value is int?)
        {
            int? intValue = (int?)value;
            if (intValue.HasValue)
            {
                return intValue.Value.ToString();
            }
        }

        return Binding.DoNothing;
    }

    public object ConvertBack(object value,
                              Type targetType,
                              object parameter,
                              CultureInfo culture)
    {
        if(value is string)
        {
            int number;
            if (Int32.TryParse((string)value, out number))
            {
                return number;
            }
        }

        return null;
    }
}
2 голосов
/ 25 января 2012

Вы можете использовать конвертер и манипулировать значениями до того, как они будут присвоены базовому свойству.

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

Используйте конвертер @ Amit, а затем, чтобы получить ошибку, используйте IDataErrorInfo со следующим кодом:

public string this[string columnName]
{
    get
    {
        if (columnName == "Number")
        {
            if (Number == null) return "Invalid number";
        }

        return null;
    }
}

Или вы можете сделать это с вашим ValidationRule, но вам нужно будет изменить его свойство ValidationStep.Ваша проверка в настоящее время запускается во время по умолчанию RawProposedValue, то есть до запуска конвертера.

...