使用IValueConverter验证可为空的int

时间:2012-01-26 04:16:43

标签: c# wpf validation validationrules converters

我正在尝试执行验证属性。我们有一个可以为null的属性:

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 个答案:

答案 0 :(得分:2)

在视图模型类中实现IDataErrorInfo接口,而不是使用NullableIntValidation类。

有一个很好的例子here

答案 1 :(得分:2)

为什么你需要一个转换器,WPF绑定足以处理这种情况。

  • 首先,如果用text绑定textBox?值并且您尝试将字符串设置为它(2b),它将自动显示它周围的红色验证错误边框。

  • 其次,如果要在空字符串的情况下设置空值,则只需为绑定设置TargetNullValue

此代码示例适合您 -

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

确保将命名空间系统命名空间添加到xaml -

xmlns:s="clr-namespace:System;assembly=mscorlib"