Binding作为数据的桥梁,连通业务逻辑层的对象(源对象)和UI的控件对象(目标对象)。在这座桥梁上,我们不仅可以控制在源对象与目标对象是双向通行还是单向通行。还可以控制数据的放行时机,甚至可以在这座桥上搭建一些关卡用来转换数据类型或者检验数据的正确性

我们先做一个最基本的例子,

创建一个"Student"类,这个类的实例将作为数据源来使用

 public class Student
{
private int _id; public int ID
{
get { return _id; }
set { _id = value; }
}
private string _name; public string Name
{
get { return _name; }
set { _name = value; }
} private int _age; public int Age
{
get { return _age; }
set { _age = value; }
} }

然后我们编写我们的控件对象和创建逻辑对象

  <StackPanel Name="stack1">
<TextBox Width="" Text="{Binding Path=ID}" HorizontalAlignment="Left" Name="txt_ID"></TextBox>
<TextBox Width="" Text="{Binding Path=Name}" HorizontalAlignment="Left" Name="txt_Name" ></TextBox>
<TextBox Text="{Binding Path=Age}" Width="" HorizontalAlignment="Left" Name="txt_Age"></TextBox>
</StackPanel>
 public Student Stu;
public MainWindow()
{
InitializeComponent();
Stu = new Student { ID = , Name = "狗娃", Age = };
       //设置元素数据绑定对象
stack1.DataContext = Stu;
}

我们可以看到TextBox控件的Text是一个{Binding} 这就是数据绑定的关键字。然后Path属性是需要绑定的属性,然后我们运行就可以看到我们已经绑定OK。

上面我们是使用的界面进行绑定,其实我们还可以使用代码对每一个控件进行绑定。现在我们将WPF界面中的绑定删除掉

 <StackPanel Name="stack1">
<TextBox Width="" HorizontalAlignment="Left" Name="txt_ID"></TextBox>
<TextBox Width="" HorizontalAlignment="Left" Name="txt_Name" ></TextBox>
<TextBox Width="" HorizontalAlignment="Left" Name="txt_Age"></TextBox>
</StackPanel>

然后我们使用代码来进行控件绑定

  public Student Stu;
public MainWindow()
{
InitializeComponent();
Stu = new Student { ID = , Name = "狗娃", Age = };
//创建Binding对象.
Binding bindingID = new Binding() {Path = new PropertyPath("ID"),Source=Stu };
//Binding构造参数可以直接传入Path参数
Binding bindingName = new Binding("Name") { Source = Stu };
Binding bindingAge = new Binding("Age") { Source = Stu }; //进行控件绑定(第一个参数是将绑定到哪个属性,第二个参数是绑定对象)
this.txt_ID.SetBinding(TextBox.TextProperty, bindingID);
this.txt_Name.SetBinding(TextBox.TextProperty, bindingName);
this.txt_Age.SetBinding(TextBox.TextProperty,bindingAge);
}

可以看到使用代码绑定需要创建Binding对象,然后使用控件的SetBinding方法进行绑定,但是郁闷的我们为了绑定这三个属性要写这么多的代码.所以使用哪种方式绑定看需求来使用.

接下来我们看双向绑定,其实上面那个我们已经实现了双向绑定,我们先做一个例子测试

创建一个测试TextBox并绑定数据ID

<TextBox Width="120"  HorizontalAlignment="Left"  Name="txt_IDTest"></TextBox>
 Binding bindingTestID = new Binding() { Path = new PropertyPath("ID"), Source = Stu };
this.txt_IDTest.SetBinding(TextBox.TextProperty, bindingTestID);

然后我们在更改txt_ID属性值后光标离开就可以看到txt_IDTest的值也随之改变了。这是因为TextBox默认是双向绑定的,所以可以改变,但是如果我们不是使用控件改变的值呢,接下来做个这样例子.在界面上添加一个Button按钮,并添加点击事件

<Button Content="Button" Width="" HorizontalAlignment="Left" Click="Button_Click"/>
 private void Button_Click(object sender, RoutedEventArgs e)
{ Stu.ID++;
}

我们在点击事件中只做了一件事,那就是让Stu的编号加1,但是运行会发现并没有改变。那么该怎么做呢。

我们需要在绑定源类型(Student类型)实现INotifyPropertyChanged接口

public class Student:INotifyPropertyChanged
{
private int _id; public int ID
{
get { return _id; }
set { _id = value; MyPropertyChanged(nameof(ID)); }
} private string _name; public string Name
{
get { return _name; }
set { _name = value; MyPropertyChanged(nameof(Name)); }
} private int _age; public event PropertyChangedEventHandler PropertyChanged; public int Age
{
get { return _age; }
set { _age = value; MyPropertyChanged(nameof(Age)); }
}
private void MyPropertyChanged(string name)
{
if(PropertyChanged!=null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}

然后此时我们就可以实现改变了.

2.绑定更新的计时

但是我们往往需要在输入后就让它立即改变,所以我们需要设置Binding对象中的UpdateSourceTrigger属性,

  Binding bindingID = new Binding() { Path = new PropertyPath("ID"), Source = Stu, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};

UpdateSourceTrigger枚举值有4个

  • Default:绑定目标属性的默认值
  • PropertyChanged:每当绑定目标属性发生改变时,都会更新数据源
  • LostFocus:每当绑定目标元素失去焦点时,都会更新绑定源
  • Explicit:仅在调用System.Windows.Data.BindingExpression.UpdateSource 方法时更新绑定源。

因此我们将UpdateSourceTrigger的属性值改成PropertyChanged即可

3.设置单项和双向绑定

刚才使用了TextBox的双向绑定,但是比如我们现在不需要双向绑定,我们只需设置Mode属性即可

 Binding bindingID = new Binding() { Path = new PropertyPath("ID"), Source = Stu,Mode = BindingMode.OneTime, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};

BindingMode枚举有5个值

  • TwoWay:导致更新源属性或目标属性时自动更新另一方
  • OneWay:在更改绑定源(源)时更新绑定目标(目标),如果绑定的控件为隐式只读,则此类型的绑定适用。如果无需监视目标属性的更改  则使用 System.Windows.Data.BindingMode.OneWay 绑定模式可避免 System.Windows.Data.BindingMode.TwoWay

    绑定模式的系统开销。

  • OneTime:这是实质上是 System.Windows.Data.BindingMode.OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。
  • OneWayToSource:在目标属性更改时,更新源属性。
  • Default: 使用绑定目标的默认 System.Windows.Data.Binding.Mode 值

WPF Binding学习(二)的更多相关文章

  1. WPF项目学习.二

    WPF用MVVM的解决记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案.  焦点的控制,键盘事件触发,输入框的数字限制,异步处理,隐藏状 ...

  2. WPF Binding学习(四) 绑定各种数据源

    转自:http://blog.csdn.net/lisenyang/article/details/18312199 1.集合作为数据源 首先我们先创建一个模型类 public class Stude ...

  3. WPF Binding学习(三)

    转自;http://blog.csdn.net/lisenyang/article/details/18312199 1.控件与控件间的双向绑定 WPF还支持控件作为数据源, <TextBox ...

  4. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  5. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  6. WPF Binding值转换器ValueConverter使用简介(二)-IMultiValueConverter

    注: 需要继承IMultiValueConverter接口,接口使用和IValueConverter逻辑相同. 一.MultiBinding+Converter 多值绑定及多值转换实例 当纵向流量大于 ...

  7. WPF学习二:TextBlock和Label的区别

    TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速 ...

  8. WPF Binding值转换器ValueConverter使用简介(一)

    WPF.Silverlight及Windows Phone程序开发中往往需要将绑定的数据进行特定转换,比如DateTime类型的时间转换为yyyyMMdd的日期,再如有一个值是根据另外多组值的不同而异 ...

  9. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

随机推荐

  1. python列表的操作

    1.列表的增加: li=[] li.append("hha") print(li) li=[] li.append("hha") print(li) li.in ...

  2. GIT如何从本地上传代码到github

    转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46738929 本文出自:[海龙的博客] 开篇之前说下题外话,之前写过一 ...

  3. OpenCASCADE 公众号

    OpenCASCADE 公众号 eryar@163.com 今天也注册了一个微信公众号,以后会在微信公众号中发表OpenCASCADE学习文章,Blog会与微信公众号同步.下面是微信公众号二维码,欢迎 ...

  4. 数据分析与展示——Pandas数据特征分析

    Pandas数据特征分析 数据的排序 将一组数据通过摘要(有损地提取数据特征的过程)的方式,可以获得基本统计(含排序).分布/累计统计.数据特征(相关性.周期性等).数据挖掘(形成知识). .sort ...

  5. Node: 如何控制子进程的输出

    大家知道,在一个node程序中,如果当前进程想要生成一个子进程,它可以调用child_process模块的spawn方法.spawn方法签名如下: child_process.spawn(comman ...

  6. C++ 头文件系列(iostream)

    1. 简介 这个头文件非常特殊,它只声明了8个常用流对象. 2. 8个对象 2.1 窄字符对象(char) extern istream cin extern ostream cout extern ...

  7. Find the Maximum sum

    Given an array of n elements.Find the maximum sum when the array elements will be arranged in such w ...

  8. UVA 10559 Blocks

    题目大意:有一串带颜色的方块,每次可以消掉颜色相同的一段,得到size^2的分数,问最多能得到多少分数.n≤200. 给这题状态跪下来. 显然的区间DP,但设f[i][j]是不够的. 考虑到之前做过的 ...

  9. 在海航云中部署 keepalived

    **本文属自我学习,不适合转载** 1. 准备工作 1.1 网络方面的准备工作 1.1.1 创建安全组 注意这里要添加 vrrp 协议支持,否则 keepalived 将无法正常工作. 1.1.2 创 ...

  10. 微信红包店小程序开发过程中遇到的问题 php获取附近周边商家 显示最近商家

    最近公司在做一个项目就是微信红包店.仿照的是微信官方在做的那个红包店的模式.客户抢红包,抢到以后到店消费,消费以后就可以拿到商家的红包了. 项目中的两个难点: 1通过小程序来发红包  这个之前在开发语 ...