到上一篇文章结束,你应该知道简单绑定的原理了及Binding对象在简单绑定起到的作用。如果你留心的话,你会发现我在上一篇中留下了一个列表。其中列举了能够被数据绑定支持的“数据源”都有那些。其中主要包含单一对象、集合及集合中包含集合这样的三大类别的对象。其中在简单绑定中,我已经描述了如何绑定对象到控件中。而绑定到集合和集合中的集合就需要了解复杂绑定了。
复杂绑定可以简单的理解为如何将集合或集合的集合绑定到控件的过程。在这个过程中,你对发现有某些地方和简单绑定很相似,但实际上当控件绑定到集合类的对象的时候和我们认识的简单绑定的过程是有区别的。复杂绑定是依赖与简单绑定过程的。先来看看下面的例子:
项目包含两个部分:Person类和Form类。
Person类的代码:
2using System.Collections.Generic;
3using System.Text;
4
5namespace ComplexBinding
6{
7 //将要用于集合中的项对象。
8 class Person
9 {
10 private string _name;
11
12 public string Name
13 {
14 get { return _name; }
15 set { _name = value; }
16 }
17 private int _age;
18
19 public int Age
20 {
21 get { return _age; }
22 set { _age = value; }
23 }
24 //请保留这个构造函数。
25 public Person() { }
26
27 public Person(string name, int age)
28 {
29 this.Name = name;
30 this.Age = age;
31 }
32 }
33}
34
Form1的界面:
Form1.cs代码
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9namespace ComplexBinding
10{
11 public partial class Form1 : Form
12 {
13 public Form1()
14 {
15 InitializeComponent();
16 //建立一个集合,让它维持多个Person对象。
17 List<Person> list = new List<Person>();
18 list.Add(new Person("Caipeng", 32));
19 list.Add(new Person("WangLiLi", 30));
20 list.Add(new Person("Colin.Cai", 0));
21 this.txtName.DataBindings.Add("Text", list, "Name");
22 this.txtAge.DataBindings.Add("Text", list, "Age");
23 }
24
25
26 }
27}
看看上面的代码中的21行和22行。你会发现两个TextBox中指定的数据源都是list(集合),在前面我讲过了,在此之后的那个参数一般是对象的属性名称。可list哪来的Name和Age属性呢?我在这里指定的"Name" 和 "Age"确实是属性,不过是Person对象中的属性。是不是满是疑问。其中可能的两个疑问是
1.TextBox怎么能显示一个集合呢,是不是数据绑定老人家搞错了?
2.list中没有Name和Age属性呀!!!就算指定的是list中维持的某个对象的属性,那应该关联的是第一个还是第二个呢??
要确定的第一件事情,集合确实无法显示在TextBox这样的控件中。它可以很好的显示在类似DataGridView这样的控件中。其次要确定的事情是,两个TextBox中显示的数据确实来自list,但准确的说是来自list中包含的某一个Person对象。如果你现在就运行这个程序的话,你会发现两个TextBox中显示的数据是list中的第一个Person对象的Name和Age的值。
我要解释一下,当数据源是一个集合的时候,到底发生了什么。
首先,当数据绑定机制发现你绑定的数据源是一个集合,那么它会采取一种不同简单绑定的方式来对待这个数据源。如果是绑定到的是TextBox这样的控件话,它会先从那个集合中猎取一项出来。在这个例子里就是第一个person对象。
接下来,数据绑定机制会将这个对象中的属性和控件中的属性关联起来(和简单绑定中所描述的一样。)
再接下来,我不能欺骗大家没有“再接下来”了。上面的两个步骤就已经完成了一个复杂绑定。
谁负责处理以上的过程呢?是BindingContext类,它管理着这个过程。(如果我的理解能力没有问题的话)
没有你们想象中的复杂吧!简单到你想骂我。别骂,之所以这样简单只因为我还没有讲到难的地方。不管怎样,你已经认识了复杂绑定了。
接下来我们将上面的例子做进一步的修改。看看下面的代码:
Form1界面:
Form1的代码:
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9namespace ComplexBinding
10{
11 public partial class Form1 : Form
12 {
13 CurrencyManager cm;
14 public Form1()
15 {
16 InitializeComponent();
17 //建立一个集合,让它维持多个Person对象。
18 List<Person> list = new List<Person>();
19 list.Add(new Person("Caipeng", 32));
20 list.Add(new Person("WangLiLi", 30));
21 list.Add(new Person("Colin.Cai", 0));
22 this.txtName.DataBindings.Add("Text", list, "Name");
23 this.txtAge.DataBindings.Add("Text", list, "Age");
24 //增加以下的语句,获得管理集合的管理对象.
25 //下面的两个button演示cm如果管理集合的简单方法.
26 cm = (CurrencyManager)this.BindingContext[list];
27 }
28
29 private void button2_Click(object sender, EventArgs e)
30 {
31 //将当前的位置++
32 cm.Position++;
33 }
34
35 private void button1_Click(object sender, EventArgs e)
36 {
37 //将当前的位置--
38 cm.Position--;
39 }
40
41
42 }
43}
可先看看上面的例子的效果。你会发现当你点击Button2或Button1的时候,两个控件中的数据会发生相应的变化。我想从这个例子证明我以上描述复杂绑定的过程是正确的并且也想从这个例子衍生出另一个我们值得关注的问题。那就是你不得不去认识的一个BindingContext类,如果你想深入的了解数据绑定机制的话。
下一篇中我将进一步对数据绑定进行解释。
代码下载
完成...