.NET: WPF Binding对数据的校验和转换

一。校验

一般需要对target上的值进行校验。

xaml:

1 <Window x:Class="WpfApplication1.MainWindow"
2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4         Title="Simple Binding" Height="135" Width="300">
5     <StackPanel x:Name="stackPanel" Background="LightBlue">
6         <TextBox x:Name="textBox1" Margin="5" />
7         <Slider x:Name="slider1" Minimum="0" Maximum="100" Margin="5" />
8     </StackPanel>
9 </Window>

写一个RangeValidationRule类

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows.Controls;
 7
 8 namespace WpfApplication1
 9 {
10     class RangeValidationRule : ValidationRule
11     {
12         public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
13         {
14             double d = 0;
15             if (double.TryParse(value.ToString(), out d))
16             {
17                 if (d >= 0 && d <= 100)
18                 {
19                     return new ValidationResult(true, null);
20                 }
21             }
22             return new ValidationResult(false, "Validation Failed");
23         }
24     }
25 }

再在xaml.cs里这么写

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 using System.Data;
16 using MySql.Data;
17 using MySql.Data.Entity;
18 using MySql.Data.MySqlClient;
19 using System.Xml;
20 using System.Xml.Linq;
21
22 namespace WpfApplication1
23 {
24     /// <summary>
25     /// Interaction logic for MainWindow.xaml
26     /// </summary>
27     public partial class MainWindow : Window
28     {
29         public MainWindow()
30         {
31             InitializeComponent();
32             Binding binding = new Binding("Value") { Source = this.slider1 };
33             binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
34             RangeValidationRule rvr = new RangeValidationRule();
35             binding.ValidationRules.Add(rvr);
36             this.textBox1.SetBinding(TextBox.TextProperty, binding);
37         }
38
39     }
40 }

如果在textbox里的数不在0到100范围里,其边框就会变成红色

在这里Source是slider1,target是textBox1。一般来说Source的数据都是正确的,而target的数据可能是用户输入的,有可能是不正确的,所以需要校验。上面的代码是不会对Source更新数据时进行校验的,如果说Source的数据也有可能有问题,我们就需要将校验条件的ValidatesOnTargetUpdated属性设为true

xaml:

1 <Window x:Class="WpfApplication1.MainWindow"
2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4         Title="Simple Binding" Height="135" Width="300">
5     <StackPanel x:Name="stackPanel" Background="LightBlue">
6         <TextBox x:Name="textBox1" Margin="5" />
7         <Slider x:Name="slider1" Minimum="-10" Maximum="110" Margin="5" />
8     </StackPanel>
9 </Window>

xaml.cs:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 using System.Data;
16 using MySql.Data;
17 using MySql.Data.Entity;
18 using MySql.Data.MySqlClient;
19 using System.Xml;
20 using System.Xml.Linq;
21
22 namespace WpfApplication1
23 {
24     /// <summary>
25     /// Interaction logic for MainWindow.xaml
26     /// </summary>
27     public partial class MainWindow : Window
28     {
29         public MainWindow()
30         {
31             InitializeComponent();
32             Binding binding = new Binding("Value") { Source = this.slider1 };
33             binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
34             RangeValidationRule rvr = new RangeValidationRule();
35             rvr.ValidatesOnTargetUpdated = true;
36             binding.ValidationRules.Add(rvr);
37             this.textBox1.SetBinding(TextBox.TextProperty, binding);
38         }
39
40     }
41 }

当slider的值小于0或者大于100时,textbox的边框就会变红,数字是不在0到100内的

如果要显示这个错误信息,需要加入侦听器,具体代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 using System.Data;
16 using MySql.Data;
17 using MySql.Data.Entity;
18 using MySql.Data.MySqlClient;
19 using System.Xml;
20 using System.Xml.Linq;
21
22 namespace WpfApplication1
23 {
24     /// <summary>
25     /// Interaction logic for MainWindow.xaml
26     /// </summary>
27     public partial class MainWindow : Window
28     {
29         public MainWindow()
30         {
31             InitializeComponent();
32             Binding binding = new Binding("Value") { Source = this.slider1 };
33             binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
34             RangeValidationRule rvr = new RangeValidationRule();
35             rvr.ValidatesOnTargetUpdated = true;
36             binding.ValidationRules.Add(rvr);
37             binding.NotifyOnValidationError = true;
38             this.textBox1.SetBinding(TextBox.TextProperty, binding);
39             this.textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(this.ValidationError));
40         }
41
42         private void ValidationError(object sender, RoutedEventArgs e)
43         {
44             if (Validation.GetErrors(this.textBox1).Count > 0)
45             {
46                 this.textBox1.ToolTip = Validation.GetErrors(this.textBox1)[0].ErrorContent.ToString();
47             }
48         }
49     }
50 }

二。 转换

时间: 2024-10-06 03:59:37

.NET: WPF Binding对数据的校验和转换的相关文章

WPF Data Binding之数据的转换和校验【四】

Binding的作用就是架在Source和Target之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实社会中桥梁需要设置安检和关卡一样,Binding这座桥上也可以设置关卡对数据进行验证,不仅如此,如果Binding两端需要不同的数据类型的时候我们还可以为数据设置转换器. Binding用于数据有效性校验的关卡是他的ValidationRules属性,用于数据类型转换的关卡是它的Convert属性. 1.1 Binding的数据校验 Binding的ValidationRules属性是Co

WPF之Binding对数据的转换(第五天)

Binding在Slider控件与TextBox控件之间建立关联,值可以互相绑定,但是它们的数据类型是不同的,Slider是Double类型,Text为String.原来,Binding有一种机制称为数据转换(Data Converter),当数据绑定的源与目标不同类型时,处理比较简单时,系统就自动的进行了类型转换,但是对于相对复杂的类型转换时,就需要我们手动进行了. 下面用一个例子来说明Convert的应用,程序的用途是在列表里面向玩家显示一些球的状态. 首先创建几个自定义数据类型: publ

WPF Binding值转换器ValueConverter使用简介(一)

WPF.Silverlight及Windows Phone程序开发中往往需要将绑定的数据进行特定转换,比如DateTime类型的时间转换为yyyyMMdd的日期,再如有一个值是根据另外多组值的不同而异的,此时我们就需要定制自己的Converter. .Net Framework提供了两种Converter接口,单值转换的接口IValueConverter和多值转换的接口IMultiValueConverter,它们都属于System.Windows.Data命名空间,在程序集Presentati

WPF Binding学习(二)

Binding作为数据的桥梁,连通业务逻辑层的对象(源对象)和UI的控件对象(目标对象).在这座桥梁上,我们不仅可以控制在源对象与目标对象是双向通行还是单向通行.还可以控制数据的放行时机,甚至可以在这座桥上搭建一些关卡用来转换数据类型或者检验数据的正确性 我们先做一个最基本的例子, 创建一个"Student"类,这个类的实例将作为数据源来使用 public class Student { private int _id; public int ID { get { return _id

WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProperty)只能拥有一个binding. 这一点可以通过设置binding对象的方法名得知: public static BindingExpressionBase SetBinding( DependencyObject target, DependencyProperty dp, BindingB

WPF Binding值转换器ValueConverter使用简介(二)-IMultiValueConverter

注: 需要继承IMultiValueConverter接口,接口使用和IValueConverter逻辑相同. 一.MultiBinding+Converter 多值绑定及多值转换实例 当纵向流量大于横向流量时指示灯应为绿色,当纵向流量小于横向流量时指示灯应为红色,否则指示灯为黄色. 1.定制ColorConverter类,此时Convert中参数是object[] values,values[0]对应MultiBinding中的第一个Binding值,这里是纵向流量值,依此类推,可以在Mult

背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 绑定 DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件 UpdateSourceTrigger - 数据更新的触发方式 对绑定的数据做自定义转换 示例1.演示 DataContextChanged 的用法Bind/DataContextChanged.xaml <Page x:Class="Windows10.Bind.DataContex

WPF中的数据模板(DataTemplate)(转)

原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate)                                                                                                                          周银辉 在WPF中我们可以为自己的数据定制显示方式,也就是说虽然某数据

WPF 精修篇 数据触发器

原文:WPF 精修篇 数据触发器 数据触发器 可以使用Binding 来绑定控件 或者数据源 来触发相关动作 举栗子 <Window.Resources> <Style TargetType="{x:Type Label}"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=red,Path=IsChecked}" Value="True&qu