大佬教程收集整理的这篇文章主要介绍了WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
http://www.cnblogs.com/DragonInSea/archive/2009/05/22/1486801.html
http://www.cnblogs.com/mycom/archive/2010/12/21/1911827.html( I过T)
通过代码实现数据绑定,使用的是System.Windows.Data命名空间的Binding类,主要使用Binding类的如下的属性:
在绑定目标控件上使用SetBinding方法添加数据绑定。例如将MyData的Name属性绑定到txtName控件的Text属性上,使用MyColorConverter转换器将MyBindingColor的ColorObject属性绑定到rec控件的Fill属性上:
1: MyData data = new MyData();
2:
3: Binding binding1 = new Binding();
4: binding1.source = data;
5: binding1.Mode = BindingMode.oneWay;
6: binding1.Path = new PropertyPath("Name");
7:
8: txtName.SetBinding(TextBox.TextProperty,binding1);
9:
10:
11: MyBindingColor color = new MyBindingColor();
12:
13: Binding binding2 = new Binding();
14: binding2.source = color;
15: binding2.Mode = BindingMode.oneWay;
16: binding2.Path = new PropertyPath("ColorObject");
17: binding2.Converter = new MyColorConverter();
18:
19: rec.SetBinding(Rectangle.FillProperty,binding2);
对于绑定数据的验证,系统采用如下的机制:
使用 WPF 数据绑定模型可以将 ValidationRules 与 Binding 对象相关联。当绑定目标的属性向绑定源属性传递属性值时(仅限TwoWay模式或OneWayTosource模式),执行ValidationRule中的Validate方法,实现对界面输入数据的验证。
定义验证可以采用以下三种:
例如,定义一个学生信息类,要求其学生成绩在0到100间,学生姓名的长度在2到10个字符间:
2: {
3: #region 构造方法
4: public studenTinfoWithValidation()
5: {
6: studentName = "Tom";
7: score = 90;
8: }
9: public studenTinfoWithValidation(String m_studentName,double m_score)
10: {
11: studentName = m_studentName;
12: score = m_score;
13: }
14: #endregion
15:
16: #region 属性
17: public String studentName
18: {
19: get; set;
20: }
21: public double score
22: {
23: get; set;
24: }
25: #endregion
26:
27: #region 实现IDataErrorInfo接口的成员
28: public String Error
29: {
30: get
31: {
32: return null;
33: }
34: }
35:
36: public String this[String columnName]
37: {
38: get
39: {
40: String result = null;
41:
42: switch (columnName)
43: {
44: case "studentName":
45: // 设置studentName属性的验证规则
46: int len = studentName.Length;
47: if (len < 2 || len > 10)
48: {
49: result = "studentName length must between 2 and 10";
50: }
51: break;
52: case "score":
53: // 设置score属性的验证规则
54: if (score < 0 || score > 100)
55: {
56: result = "score must between 0 and 100";
57: }
58: break;
59: }
60:
61: return result;
62: }
63: }
64: #endregion
65: }
在界面上,定义两个TextBox绑定到studentName和score两个属性上,并设置其采用DataErrorValidationRule:
2: xmlns="http://scheR_112_11845@as.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://scheR_112_11845@as.microsoft.com/winfx/2006/xaml"
4: xmlns:local="clr-namespace:WPFDataBindingDemo"
5: title="WinDataErrorValidationRuleDemo" Height="154" Width="300">
6: <Canvas Height="116" x:Name="mainCanvas">
7: <Canvas.resources>
8: <local:studenTinfoWithValidation x:Key="myData" />
9: </Canvas.resources>
10: <Canvas.DataContext>
11: <Binding source="{Staticresource myData}" />
12: </Canvas.DataContext>
13: <Label Canvas.Left="10" Canvas.Top="10" Height="28" Name="label1" Width="120">studentName:</Label>
14: <Label Canvas.Left="10" Canvas.Top="36" Height="28" Name="label2" Width="120">score:</Label>
15: <TextBox Canvas.Left="136" Canvas.Top="12" Height="23" Name="textBox1" Width="120">
16: <TextBox.Text>
17: <Binding Path="studentName"
18: @H_961_523@mode="TwoWay"
19: updatesourcetrigger="PropertyChanged"
20: ValidatesOnDataErrors="True" />
21: </TextBox.Text>
22: </TextBox>
23: <TextBox Canvas.Left="136" Canvas.Top="41" Height="23" Name="textBox2" Width="120">
24: <TextBox.Text>
25: <Binding Path="score" @H_961_523@mode="TwoWay" updatesourcetrigger="PropertyChanged">
26: <!--与上一个TextBox控件的写法作用相同-->
27: <Binding.ValidationRules>
28: <DataErrorValidationRule />
29: </Binding.ValidationRules>
30: </Binding>
31: </TextBox.Text>
32: </TextBox>
33: <Button Canvas.Left="12" Canvas.Top="79" Height="23" Name="button1" Width="118" Click="button1_Click">Get student Info</Button>
34: <Button Canvas.Left="136" Canvas.Top="79" Height="23" Name="button2" Width="118" Click="button2_Click">Get Validate State</Button>
35: </Canvas>
36: </Window>
从执行的结果上来看,当验证出现@L_874_26@(即索引器属性返回的字符串不为空时),系统默认给出一种验证@L_874_26@的显示方式(控件以红色边框包围),但是需注意两点:
例如上例中,对于score对应的TextBox,再加入ExceptionValidationRule:
2: <TextBox.Text>
3: <Binding Path="score" @H_961_523@mode="TwoWay" updatesourcetrigger="PropertyChanged">
4: <!--与上一个TextBox控件的写法作用相同-->
5: <Binding.ValidationRules>
6: <DataErrorValidationRule />
7: <ExceptionValidationRule />
8: </Binding.ValidationRules>
9: </Binding>
10: </TextBox.Text>
11: </TextBox>
例如,定义一个类,用来验证输入的Email地址是否合法(验证的Email允许为字符串的空值String.Empty,但有输入必须符合Email的格式要求)
在学生类中添加Email可读可写属性(并不做相应的验证,忽略其他重复代码):
定义一个类,实现Email格式验证:
2: using System.Text.RegularExpressions;
3: using System.Windows.Controls;
4:
5: namespace WPFDataBindingDemo
6: {
7: public class EmailValidationRule : ValidationRule
8: {
9: public override ValidationResult Validate(object value,CultureInfo cultureInfo)
10: {
11: bool isValid = false;
12: String message = null;
13:
14: // 检查输入值不为空,且是字符串
15: if (value != null && value is String)
16: {
17: String email = value.ToString();
19: // 检查输入的字符串是否为String.Empty
20: if (email != String.Empty)
21: {
22: String emailFormartRegex =
23: @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.)|" +
24: @"(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
25:
26: // 检查输入的字符串是否符合Email格式
27: isValid = Regex.Ismatch(email,emailFormartRegeX);
28:
29: if (! isValid)
30: {
31: message = "Input String not match Email Format";
32: }
33: }
34: else
35: {
36: // 输入的字符串为字符串空值时,认为验证通过
37: isValid = true;
38: }
39: }
40: else
41: {
42: message = "Input value is NULL or is not String.";
43: }
44:
45: // 返回验证结果(ValidationResult对象)
46: return new ValidationResult(isValid,messagE);
47: }
48: }
49: }
在界面上:
在数据验证@L_874_26@后,可以通过以下两种方式提供相应的视觉效果:
如果要使输入的控件的外观发生变化,可以使用Style。例如上例中出错,使输入的文本框的背景颜色和字体颜色发生变化,并提供ToolTip显示@L_874_26@信息,可以定义如下的Style:
2: <Setter Property="BACkground" Value="White" />
3: <Setter Property="Foreground" Value="Black" />
4: <Style.triggers>
5: <trigger Property="Validation.HasError" Value="True">
6: <Setter Property="BACkground" Value="#DDD" />
7: <Setter Property="Foreground" Value="Red" />
8: <Setter Property="ToolTip"
9: Value="{Binding Relativesource={Relativesource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
10: </trigger>
11: </Style.triggers>
12: </Style>
效果如下:
如果要为相应的控件添加一些辅助的控件,可以使用控件模板,如出现验证@L_874_26@时,不使用系统默认的红色边框,而是在文本框后添加一个红色的星号:
2: <DockPanel>
3: <AdornedElementPlaceholder/>
4: <TextBlock Foreground="Red" FontSize="20">*</TextBlock>
5: </DockPanel>
6: </ControlTemplate>
@H_166_1973@
以上是大佬教程为你收集整理的WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证全部内容,希望文章能够帮你解决WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。