WPF中Binding数据校验、并捕获异常信息的三种方式

119 阅读1分钟

Binding数据校验、并捕获异常信息的三种方式

WPF在使用Binding时,经常需要进行数据校验,如果校验失败需要捕获失败的原因,并加以展示,本文主要介绍数据校验异常并捕获的三种方式。

依赖属性异常捕获

  1. 先定义一个依赖属性
public int Value
{
    get { return (int)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}
//第5个参数为验证回调函数
public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", typeof(int), typeof(MainWindow), new PropertyMetadata(0), new ValidateValueCallback(OnValueValidation));

private static bool OnValueValidation(object value)
{
    if (value.ToString() == "123")
        return false;

    return true;
}
  1. 想要获得错误内容,需要用Validation.Errors静态函数,获得一个集合,一般都是一条数据。
  2. XAML代码
<TextBox x:Name="tb">
    <TextBox.Text>
        <Binding
            Path="Value"
            RelativeSource="{RelativeSource AncestorType=Window}"
            UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <!--绑定数据源更新时引发的异常规则-->
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

<TextBlock Text="{Binding Path=(Validation.Errors)[0].ErrorContent, ElementName=tb}" />

在这里插入图片描述

属性抛出Exception异常捕获

如果不是依赖属性,可以利用引发异常的方式来让XAML来捕获。

  1. 类中的某个普通属性

    public class MyData
    {
        private string _value = "200";
    
        public string Value
        {
            get { return _value; }
            set
            {
                _value = value;
    
                if (value == "123")
                    throw new System.Exception("报错了~~~[Exception]");
            }
        }
    }
    
  2. 在XAML中增加DataContext

<Window.DataContext>
    <local:MyData />
</Window.DataContext>
  1. XAML界面代码
<TextBox x:Name="tb1">
    <TextBox.Text>
        <Binding Path="Value" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
<TextBlock Text="{Binding Path=(Validation.Errors)[0].ErrorContent, ElementName=tb1}" />

此时在文本框中输入123,会直接引发异常

点击继续调试,会出现如下效果,调试状态下会比较难受,但是在程序打包运行后,效果和之前一样,但是不推荐这样,比较消耗资源。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zG4PJmPg-1673592883266)(Binding数据校验的三种方式.assets/image-20230113144430817.png)]

使用ValidationRule异常捕获

可以自定一个类,继承自ValidationRule,类中包括验证规则

  1. 新建规则类
public class ValueValidtionRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (value.ToString() == "123")//报错
            return new ValidationResult(false, "报错了~~~~[ValueValidtionRule]");
        return new ValidationResult(true, "");
    }
}
  1. XAML中
<TextBox x:Name="tb2">
    <TextBox.Text>
        <Binding
            Path="Value"
            RelativeSource="{RelativeSource AncestorType=Window}"
            UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:ValueValidtionRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
<TextBlock Text="{Binding Path=(Validation.Errors)[0].ErrorContent, ElementName=tb2}" />

在这里插入图片描述