这里的Binding从字面上的意思就是数据绑定。
今天我不想写太多的东西。因为今晚还有许多东西要做。所以今天就一起探讨一个问题——Binding的使用问题。
第一点:Binding可以称作为数据的管道。两头分别是数据源,数据对象。也就是Source--->Target.源和对象
之间有时候可以使单向的,有时候可以使双向的。这里的设定可以使用Mode对象。他是一个枚举。有四个属性值。
大家可以查看相关文档。在接下来的例子中,我们也会看到。
第二点:Binding对象。也就是说。我们把我的一个源中的什么属性交给Target。我们可以设置Binding中的Path
来告诉我们的程序。我们是把那个对象给我们的Target。
第三点:在第一点中我们说过,Binding可以使双向的。那么数据改变的时候。在什么场合会进行更新源。或者
更新Target了。这里又要牵扯到一个新的东西就是触发器。通过设置UpdateSourceTrigger这个属性来设定触发的
时机。
以上都是些无聊的说明性东西。只是让大家知道,我们接下来的例子中要用到什么知识点。
好了。我们看第一个例子(因为上传图片比较麻烦,所以这里我就不上传图片了。感兴趣的可以把代码照抄一遍
自己去试验下,我觉得这样印象更好)
我们来看下面的一个例子:
我先来说说这里例子要做什么,这个例子是这样的。在窗口上一个文本框,一个按钮。文本框呈现的是一个对象
的某个属性。点击按钮,改变文本的绑定源的数据。同时更新文本信息。
大家看了这点,一定觉得这个很好实现。我们只要把源拿到,更改后,重新赋给我们的控件就好了。这个是可行
的,但不是我们今天要说的。
好了我们来分析下。
第一个需求很简单。只是把某个对象给控件。但是第二个需求了?首先要知道我们的Binding是很智能的。只要源
的数据一旦发生了改变。目标显示也会改变。怎么来改变了,肯定有个事件去监听着,我们的源数据。那么这个监
听是什么了,我们要如何来写了。
请看我定义的一个类:
namespace WpfBinding
{
/*
* 1、首先使用属性通知接口(INoticePropertyChanged)
* 2、该接口中只有一个事件属性
* 3、在属性改变的Set方法中,调用该事件方法,参数有两个,第一个是发生的类,第二个是属性名
*/
public class Student : INotifyPropertyChanged
{
#region INotifyPropertyChanged 成员
// 通过这个事件,我们就能很好控制我们的属性了变更了。
public event PropertyChangedEventHandler PropertyChanged;
#endregion
private string name;
今天我不想写太多的东西。因为今晚还有许多东西要做。所以今天就一起探讨一个问题——Binding的使用问题。
第一点:Binding可以称作为数据的管道。两头分别是数据源,数据对象。也就是Source--->Target.源和对象
之间有时候可以使单向的,有时候可以使双向的。这里的设定可以使用Mode对象。他是一个枚举。有四个属性值。
大家可以查看相关文档。在接下来的例子中,我们也会看到。
第二点:Binding对象。也就是说。我们把我的一个源中的什么属性交给Target。我们可以设置Binding中的Path
来告诉我们的程序。我们是把那个对象给我们的Target。
第三点:在第一点中我们说过,Binding可以使双向的。那么数据改变的时候。在什么场合会进行更新源。或者
更新Target了。这里又要牵扯到一个新的东西就是触发器。通过设置UpdateSourceTrigger这个属性来设定触发的
时机。
以上都是些无聊的说明性东西。只是让大家知道,我们接下来的例子中要用到什么知识点。
好了。我们看第一个例子(因为上传图片比较麻烦,所以这里我就不上传图片了。感兴趣的可以把代码照抄一遍
自己去试验下,我觉得这样印象更好)
我们来看下面的一个例子:
我先来说说这里例子要做什么,这个例子是这样的。在窗口上一个文本框,一个按钮。文本框呈现的是一个对象
的某个属性。点击按钮,改变文本的绑定源的数据。同时更新文本信息。
大家看了这点,一定觉得这个很好实现。我们只要把源拿到,更改后,重新赋给我们的控件就好了。这个是可行
的,但不是我们今天要说的。
好了我们来分析下。
第一个需求很简单。只是把某个对象给控件。但是第二个需求了?首先要知道我们的Binding是很智能的。只要源
的数据一旦发生了改变。目标显示也会改变。怎么来改变了,肯定有个事件去监听着,我们的源数据。那么这个监
听是什么了,我们要如何来写了。
请看我定义的一个类:
namespace WpfBinding
{
/*
* 1、首先使用属性通知接口(INoticePropertyChanged)
* 2、该接口中只有一个事件属性
* 3、在属性改变的Set方法中,调用该事件方法,参数有两个,第一个是发生的类,第二个是属性名
*/
public class Student : INotifyPropertyChanged
{
#region INotifyPropertyChanged 成员
// 通过这个事件,我们就能很好控制我们的属性了变更了。
public event PropertyChangedEventHandler PropertyChanged;
#endregion
private string name;
public string Name
{
get {
return this.name;
}
set {
this.name = value;
if (this.PropertyChanged != null) {
{
get {
return this.name;
}
set {
this.name = value;
if (this.PropertyChanged != null) {
// 只要属性发生改变。就会通知我们的目标。目标也同样更新
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}
}
}
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}
}
}
好。我们来应用:
界面设计很简单:
<TextBox BorderBrush="Black" Margin="5" x:Name="txtStuName"/>
<Button Content="改变属性" Width="100" Height="30" Click="Button_Click"/>
只有一个空间一个按钮。
在后台文件中我们来做数据的绑定:
为了方便说明,我们定义一个全局的Student对象,变量名为stu.
在窗体构造函数里面,我们来看看如果做数据绑定。
/*
* 使用Binding来实现数据绑定。
* 1、声明数据源。这里就是我们的Student类了。
* 2、声明Binding对象。
* 3、把Binding对象的数据源和我们Student关联起来
* 4、指定绑定的访问路径,也就是要绑定的属性了
* 5、让绑定的数据同我们的UI关联起来。
*/
stu = new Student();
stu.Name = "我是";
界面设计很简单:
<TextBox BorderBrush="Black" Margin="5" x:Name="txtStuName"/>
<Button Content="改变属性" Width="100" Height="30" Click="Button_Click"/>
只有一个空间一个按钮。
在后台文件中我们来做数据的绑定:
为了方便说明,我们定义一个全局的Student对象,变量名为stu.
在窗体构造函数里面,我们来看看如果做数据绑定。
/*
* 使用Binding来实现数据绑定。
* 1、声明数据源。这里就是我们的Student类了。
* 2、声明Binding对象。
* 3、把Binding对象的数据源和我们Student关联起来
* 4、指定绑定的访问路径,也就是要绑定的属性了
* 5、让绑定的数据同我们的UI关联起来。
*/
stu = new Student();
stu.Name = "我是";
/*第一种绑定的方法(这个看起来代码有点多啊。还有简单的方法我们来看看这种方式)
Binding bind = new Binding(); // 申明一个Binding对象
bind.Source = stu; // 我们的数据源就是我们Student实例。这里是制定源
bind.Path = new PropertyPath("Name"); // 这里是制定要绑定源中的那个属性
BindingOperations.SetBinding(this.txtStuName,TextBox.TextProperty, bind); // 这里是让我们的源和Target关联起来
*/
Binding bind = new Binding(); // 申明一个Binding对象
bind.Source = stu; // 我们的数据源就是我们Student实例。这里是制定源
bind.Path = new PropertyPath("Name"); // 这里是制定要绑定源中的那个属性
BindingOperations.SetBinding(this.txtStuName,TextBox.TextProperty, bind); // 这里是让我们的源和Target关联起来
*/
// 第二种绑定的方法 这个很简洁。我就不说明了。和上面其实是一样的。
this.txtStuName.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu });
this.txtStuName.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu });
上面就是数据绑定完毕了。
下面我们来看看按钮里面我们做了什么
private void Button_Click(object sender, RoutedEventArgs e)
{
stu.Name = stu.Name + "Tom";
}
下面我们来看看按钮里面我们做了什么
private void Button_Click(object sender, RoutedEventArgs e)
{
stu.Name = stu.Name + "Tom";
}
其他什么也没有做。当我们运行起来,点击按钮,我们的文本框就变成"我是Tom";这里是不是很神奇。大家可以去试验下。
下面的这个例子是为了验证数据绑定是双向的。
试验是这样的。在窗体上有个文本框,滑块。滑动滑块,文本中数据会改变。我们改变文本框的数据,滑块也会改变。相信大家
在脑海里面有一个印象了。我们直接看代码的实现:
首先看XAML文件的布局。也很简单。一个TextBox,一个Slider。我的注释写的都很清楚哦。
<!--
把控件作为Binding的源来实现数据绑定
1、在显示的属性中使用Binding形式如下:{Binding Path=Value,ElementName=控件名}
2、这里的Path指代要数据源的属性
3、这里的实现有几种形式:
A、利用Binding的扩展方法。如:{Binding Path=Value, ElementName=silder}
B、利用Binding的构造方法。其可以直接接受一个Path参数 如:{Binding Value, ElementName=silder}
C、后台使用代码来实现 如: this.txtSilder.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName = "silder" });
在这里,因为在cs中,我们可以直接访问控件。所以我们可以不使用ElementName来进行banding。可以这样来写:
this.txtSilder.SetBinding(TextBox.TextProperty, new Binding("Value") { Source = this.silder });
4、关于Binding还有几种属性:
1、BindingMode.(TwoWay,OneWay,OnTime,OneWayToSource和Default)即更新模式
2、UpdateSourceTrigger:(PropertyChnaged,LostFocus,Explicit,Default)
-->
<TextBox BorderBrush="Black" Margin="5" x:Name="txtSilder"></TextBox>
<Slider BorderBrush="LightBlue" Minimum="0" Maximum="100" Margin="5" x:Name="silder"></Slider>
看了注释我们应该知道有很多种Binding方法了。这几种方法我都试过。所以现在保留下来的文件时使用最后一个方法。
后台大家也知道什么方法了啊。
就是:
// 采用控件作为另一个控件的数据源
this.txtSilder.SetBinding(TextBox.TextProperty, new Binding("Value") { Source = this.silder,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
其他什么代码就没有了。就是这么简单。大家去试验下。