数据绑定的意义在前面的文章中已经做了描述。现在我们来具体了解一下数据绑定。
数据绑定被分为两个部分,(至少我是这样来分的)简单绑定和复杂绑定。以一种简单的方式来理解的话,简单绑定是只控件和某个单一对象之间的绑定,而复杂绑定是指和集合(ArrayList, Array, DataTable, DataSet)之间的绑定,而复杂绑定中隐含着简单绑定。所以我们必须先搞清楚简单绑定的想法(也是数据绑定实现的最基本的想法)。
前面描述过了数据绑定机制的想法是将数据和控件关联在一起的机制。那对于一个单一对象而言什么是数据呢?对象本身其实就可能包含一定的数据。比如我们知道的成员变量,它就在帮对象维持数据。而对于数据绑定机制而言,它关心的是属性。如果我们能将某个对象的属性和控件的某个属性关联在一起,那数据就可以自如的显示到控件中了。所以对我的认识而言,我认为简单绑定做的事情就是将对象中的属性和控件的属性关联。
考虑一下的代码。假设我定义了一个Person类,在这个类中我定义了三个属性FirstName, LastName, Age,我想将这三个属性分别显示在三个TextBox中。如果不使用数据绑定我们需要的代码如下。
Person person
=
new
Person(
"
Cai
"
,
"
Peng
"
,
32
);
textbox1.Text
=
person.FirstName;
textbox2.Text
=
person.LastName;
textBox3.Text
=
person.Age;
这样做有什么问题吗?看来是没有什么问题,你的数据可以正常的显示在界面中。问题就在与如果用户修改了textBox1中的数据,你的person对象中的FirstName的值也会更改吗?如果你想确保person.FirstName中的值和你的textBox1.Text的值一致的话你要怎么做?你必须编写相应的代码来完成。比如你可以
在textBox1的TextChanged事件中编写如下的代码:
person.FirstName
=
textbox1.text
这是不使用数据绑定时我们必须要做的事情。在这样的情况下我们为了保证textBox1中的值和对象中相应的数据是一致,我们必须这样做。如果使用数据绑定会怎么样呢?
为了说明以上的这种转变,建立一个winform来说明一下:
在这个项目中我建立了一个Person类和两个界面Form1, Form2.其中Form1不是用数据绑定。
person类:
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
namespace
SimplyDataBinding
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
7
class Person
8![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
9
private string _firstname;
10![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
public string Firstname
12![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
13![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _firstname; }
14![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ _firstname = value; }
15
}
16
private string _lastname;
17![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
public string Lastname
19![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
20![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _lastname; }
21![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ _lastname = value; }
22
}
23
private int _age;
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
public int Age
26![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
27![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _age; }
28![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ _age = value; }
29
}
30![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public Person()
{ }
31
public Person(string firstname, string lastname, int age)
32![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
33
this.Firstname = firstname;
34
this.Lastname = lastname;
35
this.Age = age;
36
}
37
}
38
}
39
Form1.cs的界面:
你可以尝试在第一行的第一个TextBox中键入一些内容,你会发现第二行的对应的TextBox中的值发生了改变。但如果你去操作其他的TextBox就不会发现数据会发生相应的更改。
Form1的代码:
1
using
System;
2
using
System.Collections.Generic;
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
5
* 这个例子的想法是建立一个Person类的实例,然后将person的各个属性显示在相应的控件中。
6
* 界面中一共又6个TextBox,其中每三个Textbox用来显示person相应的三个属性。
7
* 你会发现如果在不使用数据绑定的情况下,显示数据是没有任何问题的。
8
* 但当你更改任意个Textbox中的数据的时候,你会发现相对应的另一个Textbox中的数据不会更新。
9
* 如果你想要是的两个显示相同person类同一属性的Textbox的数据保持一致,就需要编写相应的代码
10
* 去处理。我建立了第一个Textbox中的TextChanged事件,为了保证数据的一致。
11
12
*/
13
using
System.ComponentModel;
14
using
System.Data;
15
using
System.Drawing;
16
using
System.Text;
17
using
System.Windows.Forms;
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
namespace
SimplyDataBinding
20
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
21
public partial class Form1 : Form
22![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
23
private Person person;
24
public Form1()
25![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
26
InitializeComponent();
27
28
person = new Person("Cai", "Peng", 32);
29
this.txtFirstname1.Text = person.Firstname;
30
this.txtLastname1.Text = person.Lastname;
31
this.txtAge1.Text = person.Age.ToString();
32
this.txtFirstname2.Text = person.Firstname;
33
this.txtLastname2.Text = person.Lastname;
34
this.txtAge2.Text = person.Age.ToString();
35
}
36
37
private void button1_Click(object sender, EventArgs e)
38![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
39
40
}
41![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
private void txtFirstname1_TextChanged(object sender, EventArgs e)
43![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
44
//为了同步person.Firstname 和显示的数据。我们必须写下如下的代码。
45
//你可以观察到其他的没有建立相应的TextChanged事件的Textbox没又办法自动的
46
//保证数据的一致。
47
this.person.Firstname = this.txtFirstname1.Text;
48
this.txtFirstname2.Text = person.Firstname;
49
}
50
}
51
}
代码中我建立了第一个控件的TextChanged事件,以便可以使得对应的两个Textbox的数据和person对象中的Firstname可以同步进行修改。如果不使用数据绑定我们需要自己去编写代码处理上述的情况以及其他的更多的关于数据同步的情况。
下面我演示一下使用数据绑定的情况会如何
Form2的界面和Form1的界面一致,你可以重复你在Form1中所做的事情,看看会怎么样。
注意一点,当你修改了控件中的数据后请将鼠标移动到其他的控件上去,以便数据绑定机制可以帮你做数据同步的事情。
Form2的代码:
1
using
System;
2
using
System.Collections.Generic;
3
using
System.ComponentModel;
4
using
System.Data;
5
using
System.Drawing;
6
using
System.Text;
7
using
System.Windows.Forms;
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
namespace
SimplyDataBinding
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
11
public partial class Form2 : Form
12![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
13
Person person;
14
public Form2()
15![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
16
InitializeComponent();
17
person = new Person("Cai", "Peng", 32);
18
this.txtFirstname1.DataBindings.Add("Text", person, "Firstname");
19
this.txtLastname1.DataBindings.Add("Text", person, "Lastname");
20
this.txtAge1.DataBindings.Add("Text", person, "Age");
21
this.txtFirstname2.DataBindings.Add("Text", person, "Firstname");
22
this.txtLastname2.DataBindings.Add("Text", person, "Lastname");
23
this.txtAge2.DataBindings.Add("Text", person, "Age");
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
}
26
}
27
}
你们应该可以发现这段代码和Form1中的代码的区别了吧。以上的代码是以数据绑定的方式完成的。后面我将详细解释这些代码。
你一定发现了,如果你做上述相同的操作的时候两个相应的TextBox始终会保持一致的数据。而这一切的发生完全是自动的,这要得意于数据绑定了。
该解释一下了。
this.txtFirstname1.DataBindings.Add("Text", person, "Firstname");
仔细看看,你能发现,"Text" 是不是就是TextBox的Text属性。person 就是数据源,而"Firstname" 是person对象的属性。从这里就可以看的出来,以上的代码是想把Text属性和person中的Firstname属性关联在一起。这种关联就会导致数据的自动呈现和自动接受更改。本质上而言,数据绑定基本的思路就将数据源中的某个属性和控件中的某个属性关联在一起,使得数据绑定引擎能为你去处理多余的事情。
下面说点复杂点东西。数据源的属性和控件中的属性关联其实是由一个类来管理的,那个类就是Binding类。上面的代码也可以变成一下的形式
Binding binding
=
new
Binding(
"
Text
"
, person,
"
FirstName
"
);
this
.txtFirstname1.DataBindings.Add(binding);
Binding代表某对象属性值和某控件属性值之间的简单绑定。
第一参数是:控件的某个属性的名称表示。
第二参数是:对象
第三参数是:表示绑定的对象的属性的数据绑定表达式。通常情况下是属性的名称。
代码下载
总结一下,简单绑定做的事情就是将“单一的对象”的属性(一个或多个)和某个控件的属性(一个或多个)关联在一起。请注意一件事情,对与一个控件而言,控件的几乎所有的属性都可以被绑定。