一、通过代码实现数据绑定
通过代码实现数据绑定,使用的是System.Windows.Data命名空间的Binding类,主要使用Binding类的如下的属性
Source属性:绑定到的数据源
Mode属性:绑定的模式(OneTimeOneWayTwoWayOneWayToSourceDefault
Path属性:绑定到的数据源的属性
Converter属性:绑定时所使用的类型转换器
在绑定目标控件上使用SetBinding方法添加数据绑定。例如将MyDataName属性绑定到txtName控件的Text属性上,使用MyColorConverter转换器将MyBindingColorColorObject属性绑定到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方法,实现对界面输入数据的验证。
定义验证可以采用以下三种:
DataErrorValidationRule:检查由源对象的 IDataErrorInfo 实现所引发的错误,要求数据源对象实现System.ComponentModel命名空间的IDataErrorInfo接口。
例如,定义一个学生信息类,要求其学生成绩在0100间,学生姓名的长度在210个字符间:
  1: public class StudentInfoWithValidation : IDataErrorInfo
  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绑定到StudentNameScore两个属性上,并设置其采用DataErrorValidationRule
  1: <Window x:Class="WPFDataBindingDemo.WinDataErrorValidationRuleDemo"
  2:    xmlns="schemas.microsoft/winfx/2006/xaml/presentation"
  3:    xmlns:x="schemas.microsoft/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"