C# 空文本框上的int验证失败

C# 空文本框上的int验证失败,c#,wpf,validation,data-binding,idataerrorinfo,C#,Wpf,Validation,Data Binding,Idataerrorinfo,我有一个TextBox绑定到一个int属性,该属性具有[必需]和[范围(1,5)]属性,当应用程序启动时TextBox获取0,如果我按Backspace并删除该0,我会在调试日志中得到以下消息: System.Windows.Data Error: 7 : ConvertBack cannot convert value '' (type 'String'). BindingExpression:Path=Order.PartyCode; DataItem='OrderVM' (HashCode

我有一个
TextBox
绑定到一个
int
属性,该属性具有
[必需]
[范围(1,5)]
属性,当应用程序启动时
TextBox
获取
0
,如果我按Backspace并删除该0,我会在调试日志中得到以下消息:

System.Windows.Data Error: 7 : ConvertBack cannot convert value '' (type 'String'). BindingExpression:Path=Order.PartyCode; DataItem='OrderVM' (HashCode=66572856); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'
验证也不起作用。如果我使用
Nullable
而不是
int
,我会得到相同的错误


使用
TextBox
必须具有
string
属性,还是有办法解决此问题

您可以通过在绑定中使用
TargetNullValue
来解决此问题,如下所示:

这会将
TargetNullValue
设置为空字符串,告知绑定源应将空字符串转换为
null


如果您使用的是普通的
int
,则当文本更改为空字符串时,将根本无法设置属性。如果您使用的是
int?
,那么当文本变为空字符串时,您的属性将设置为
null

虽然Keith的答案可能会解决当前的问题,但用户可以在文本框中键入任何内容这一事实仍然会带来验证问题。字符串类型变量对于
TextBox.Text
binding更安全

如果您想使用int属性绑定,那么还有其他更合适的控件。由于您的验证规则只允许int值介于1和5之间,因此使用
滑块
、组合框甚至一组
单选按钮
将是一种更好的方法


如果您打算使用
文本框
,请处理
KeyDown
事件以防止用户输入非数字键。

我不知道为什么会接受负值作为有效输入。如果没有这个
argetNullValue='
验证可以完美地工作,除了空文本框的情况。可能最好的方法是扩展
textbox
类,实现
KeyDown
处理程序,并在需要时使用扩展的
textbox
,对吗?@EmonHaque:作为一个通用解决方案,您是对的。在他的特定情况下,这可能不需要(他只有5个有效值,从1到5的整数)。还值得一提的是,您所建议的东西已经由WPF工具包项目实现了。