2

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

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”时,此时应显示错误(红色边框)。我该如何解决?

注意:验证属性为真。

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

2 回答 2

2

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

这里有一个很好的例子。

于 2012-01-26T04:22:02.830 回答
2

为什么需要一个转换器呢,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"
于 2012-01-26T08:35:51.683 回答