WPF应用Binding之数据有效性检测


1. xaml

<Grid>
    <StackPanel>
        <TextBox x:Name="textBox1" Margin="5"/>
        <Slider x:Name="slider1" Minimum="-10" Maximum="110" Margin="5"/>
    </StackPanel>
</Grid>

2. C#

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Binding binding = new Binding("Value") { Source = slider1 };//绑定到slider的Value属性

            /*
             * UpdateSourceTrigger属性控制绑定源更新的执行时间,默认为LostFocus
             * 
             * LostFocus: 当TextBox失去焦点时,TextBox输入的内容才会更新源(slider)
             * PropertyChanged: TextBox输入时,TextBox输入的内容就会更新源(slider)
             */
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

            /* 实现数据检测,定义继承ValidationRule的DataValidChcker类,并实例化 */
            DataValidChcker dataChecker = new DataValidChcker();//绑定“目标”数据有效性检测,TextBox输入数据有效性

            /* 可选,需要检测“源”时设置为true */
            dataChecker.ValidatesOnTargetUpdated = true;//绑定“源”数据的有效性检测,xaml设置最小值为-10,最大值为110。不在[0, 100]范围将认为无效

            binding.ValidationRules.Add(dataChecker);//Binding有多个数据校验条件

            /* 事件1: 当数据无效时,获取无效信息时设置为true */
            binding.NotifyOnValidationError = true;//当数据校验为无效时,发出错误事件

            textBox1.SetBinding(TextBox.TextProperty, binding);

            /* 事件2:  当事件1为true时使用 */
            textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(DataValidCheckErrorHandler));//当数据校验为无效时,处理事件
        }

        void DataValidCheckErrorHandler(object sender, RoutedEventArgs arg)
        {
            int errorCount = 0;

            ReadOnlyObservableCollection<ValidationError> errors = Validation.GetErrors(textBox1);
            if (null == errors)
            {
                textBox1.ToolTip = "Unknow";
                return;
            }

            errorCount = errors.Count;

            if (errorCount > 0)
            {
                textBox1.ToolTip = errors[0].ErrorContent.ToString();
            }
            else
            {
                textBox1.ToolTip = "valid data";
            }
        }
    }

    public class DataValidChcker : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            double data = 0.0;

            if (double.TryParse(value.ToString(), out data))
            {
                if (data >= 0 && data <= 100)//有效范围: [0, 100]
                {
                    return new ValidationResult(true, "data valid");//有效
                }
            }
            return new ValidationResult(false, "data invalid");//无效
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值