请考虑以下事项:
C#:
public class MyVM {
public double DValue { get; set; }
}
XAML:
<TextBox Text={Binding DValue, UpdateSourceTrigger=PropertyChanged} />
用户输入&#34; asdf&#34;在盒子里。这不能转换为double
,因此您会在文本框中看到错误模板 - 它周围会出现红色边框。
在keydown上验证的数字文本输入的典型问题是,如果用户键入&#34; - &#34;,那么这不是有效的数值。如果用户将值完成为&#34; -1&#34;这很好,但是文本框已经很合适了。
一种解决方法是为ViewModel提供一个StringDValue
属性,用于处理&#34; - &#34;和&#34;&#34;为0,保持DValue
属性正确更新,依此类推。你可以做到这一点。值转换器是有问题的,因为事情是双向的:用户类型&#34; - &#34;,0返回到ViewModel属性,OnPropertyChanged
被触发,0返回,你得到零文本框。我认为这也是可行的,但这不是我在这里选择的路径。
当用户输入&#34; asdf&#34;时会出现问题。 StringDValue
如何告诉Binding
该值是无效输入?是否有一些异常可以抛出绑定将捕获并视为非崩溃输入错误?我抛出的每个异常类型都在绑定中未被捕获。
答案 0 :(得分:0)
这应该是显而易见的。
答案是写一个ValidationRule,就像这里的答案一样:https://stackoverflow.com/a/14481386/424129
C#
public class NumericInputTextValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
var s = (value ?? "").ToString().Trim();
double d;
var valid = s == "-" || s == "+" || s == "" || double.TryParse(s, out d);
if (!valid)
{
return new ValidationResult(false, "Not a Number");
}
return new ValidationResult(true, "");
}
}
XAML
<TextBox>
<TextBox.Text>
<Binding Path="StringDValue" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<MyNS:NumericInputTextValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>