如何复制WPF绑定类型转换错误行为

时间:2015-01-02 16:28:38

标签: wpf xaml binding

请考虑以下事项:

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该值是无效输入?是否有一些异常可以抛出绑定将捕获并视为非崩溃输入错误?我抛出的每个异常类型都在绑定中未被捕获。

1 个答案:

答案 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>