我正在尝试执行验证属性。我们有一个可以为null的属性:
public int? Number
{
get { return _number; }
set
{
if (_number != value)
{
_number = value;
RaisePropertyChanged("Number");
}
}
}
此属性绑定到文本框。我只想验证这两个方案:
所以这个的实现是:
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}}" />
答案 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"