Подтверждение обнуляемого int с использованием IValueConverter - PullRequest
2 голосов
/ 26 января 2012

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

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

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

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

Итак, реализация для этого:

public class IntConverter : IValueConverter
{
    private static readonly IntConverter defaultInstance = new IntConverter();

    public static IntConverter Default { get { return defaultInstance; } }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.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, System.Globalization.CultureInfo culture)
    {
        if (value is string)
        {
            int number;
            if (Int32.TryParse((string)value, out number))
            {
                return number;
            }
        }

        return null;
    }
}

Приведенный выше код действительно работает, но только одна вещь не приносит пользы. Когда пользователь вводит «2b», в этот момент должна отображаться ошибка (красная граница). Как я могу это исправить?

ПРИМЕЧАНИЕ. Свойства валидации имеют значение true.

    <TextBox Text="{Binding Number, UpdateSourceTrigger=PropertyChanged,
        ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True, TargetNullValue={x:Static sys:String.Empty},
        Converter={x:Static c:IntConverter.Default}}" />

Ответы [ 2 ]

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

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

  • Прежде всего, если вы связываете textBox с int?значение, и вы пытаетесь установить для него строку (2b), он автоматически покажет красную рамку ошибки проверки вокруг него.

  • Секунда, если вы хотите установить нулевое значение в случае пустогострока, все, что вам нужно для установки TargetNullValue для привязки.

Этот пример кода будет работать для вас -

<TextBox Text="{Binding Number, TargetNullValue={x:Static s:String.Empty},
                 UpdateSourceTrigger=PropertyChanged}"/>

Убедитесь, что вы добавили пространство именсистемное пространство имен для вашего xaml -

xmlns:s="clr-namespace:System;assembly=mscorlib"
2 голосов
/ 26 января 2012

Реализация интерфейса IDataErrorInfo в классе модели представления вместо использования класса NullableIntValidation.

Вот хороший пример здесь .

...