【问题标题】:Validating a nullable int using a IValueConverter使用 IValueConverter 验证可为空的 int
【发布时间】:2012-02-19 07:06:41
【问题描述】:

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

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}}" />

【问题讨论】:

    标签: c# wpf validation validationrules converters


    【解决方案1】:

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

    有一个很好的例子here

    【讨论】:

    • 我的回答还是一样。实现 IDataErrorInfo 以在 Number 属性为 null 时出现错误。
    【解决方案2】:

    为什么需要转换器呢,WPF 绑定功能强大到可以处理这种情况。

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

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

    此代码示例将为您工作 -

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

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

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

    【讨论】:

    • 感谢 TargetNullValue,我不知道。但是当出现错误边框时,有没有办法将当前值设置为null?因为当这种情况发生时,它会保持最后一个正确的值。
    • 也许我错了,但我猜IDataErrorInfo是为了验证业务规则。这就是我不想使用它的原因。也因为我会在很多观点上做同样的事情。那么,是唯一的选择吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 2014-06-27
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多