前言

作为一只菜鸟,之前学了一段时间的WPF,但是没有总结,过了一学期发现好多东西都忘记了,很多东西还是需要记下来,以备后续复习。

数据绑定在事件中应用非常广泛,可以有效地减少代码量,那么什么是数据绑定?说的简单就是从源对象提取一些信息,将其用于设置目标对象的属性,这里有一点需要注意,目标属性需要是依赖属性(Dependency Property),而源对象可以是任何内容。

数据绑定可以分为元素到元素的绑定和元素到非元素对象的绑定。

元素到元素绑定

XAML绑定

首先来看一个简单的例子

<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Slider Name="sldFontSize" Minimum="" Maximum="" VerticalAlignment="Center"></Slider>
<TextBlock Grid.Row="" Name="txbSampleText" FontSize="{Binding ElementName=sldFontSize, Path=Value, Mode=TwoWay}" HorizontalAlignment="Center">示例文本</TextBlock>
</Grid>

通过改变滑动条的值可以改变文本值,这里使用了XAML来进行数据绑定,ElementName=sldFontSize 表示绑定的源对象为上面的滑动条,Path=Value 表示源对象的属性为滑动条的值,Mode=TwoWay 表示使用双向绑定。这里有四种绑定模式

BindingMode的枚举值

 
OneWay

当源属性变化时更新目标属性

TwoWay

当源属性变化时更新目标属性,并且当目标属性变化时更新源属性

OneTime 最初根据源属性值设置目标属性,然后后续其它改变均被忽略。必要时可以减少开销
OneWayToSource

与OneWay相同,但是方向相反

Default

此类绑定依赖于目标属性,既可以双向,也可以是单向,为默认值

使用双向绑定需要更大的开销,所以一般需要合理选择绑定模式。

代码绑定

在XAML标记中使用Binding标记拓展来声明绑定表达式最为高效,但是有时候我们仍然需要使用代码来创建绑定

Binding bd = new Binding();
bd.Source = sldFontSize;
bd.Path = new PropertyPath("Value");
bd.Mode = BindingMode.TwoWay;
txbSampleText.SetBinding(FontSizeProperty, bd);

上述代码完成的功能和用XAML创建是一样的。但是明显复杂不少,那么在什么时候需要使用代码创建绑定呢

1.创建动态绑定:如果希望根据其他运行时信息修改绑定,或者根据环境创建不同的绑定,这时使用代码创建绑定更合理。

2.删除绑定:如果希望删除绑定,从而通过普通方式设置属性,可以使用ClearBinding()或ClearAllBinding()方法。

当然一个元素可以使用多个绑定

<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Slider Name="sldFontSize" Minimum="" Maximum="" VerticalAlignment="Center"></Slider>
<TextBlock Grid.Row="" Name="txbSampleText" FontSize="{Binding ElementName=sldFontSize, Path=Value, Mode=TwoWay}"
Foreground="{Binding ElementName=txtForeground ,Path=Text}" HorizontalAlignment="Center">示例文本</TextBlock>
<TextBox Grid.Row="" Name="txtForeground" FontSize="{Binding ElementName=sldFontSize, Path=Value, Mode=TwoWay}" ></TextBox>
</Grid>

截图如下

同时绑定的时候还有何时更新的问题,大部分绑定更新都是在PropertyChanged时出发,但是应该注意TextBox.Text的默认方式是LostFocus.

PropertyChanged 当目标属性发生变化时立即更新源
LostFocus 当目标属性发生变化且目标丢失焦点时更新源
Explicit 除非调用BindingExpression.UpdateSource()方法,否则不更新源
Default 根据目标属性的元数据确定更新行为(根据FrameworkPropertyMetadata.DefaultUpdateTrigger属性)

这里也需要根据开销合理选择。

绑定延迟

如果需要在更新前暂停一会,可以添加短暂的延迟时间,避免过分频繁的触发操作,如在代码中添加Delay=500,即可在用户停止输入500毫秒后更新源对象。

绑定到非元素对象

在数据驱动的程序中,使用更多的是创建从不可见对象中提取数据的绑定表达式,唯一的要求是希望显示的信息必须存储在公有属性中,此时需要放弃Binding.ElementName属性,转而使用以下属性之一

  • Source:该属性是指向源对象的引用
  • RelativeSource:使用RelativeSource指向源对象,使用此附加层可在当前元素的基础上构建引用。
  • DataContext:如果没有使用Source或RelativeSource属性指定源,那么WPF会从当前元素从元素树上开始查找,检查每个元素的DataContext属性,并使用第一个非空的DataContext属性

数据绑定在WPF技术中非常重要,下一篇文章中,我会对绑定到非元素对象进行更深入的介绍,敬请期待。

参考资料:WPF编程宝典-使用C#2012和.NET4.5(第四版)

WPF学习笔记(一):数据绑定之元素到元素绑定的更多相关文章

  1. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  2. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  3. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

  4. WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决

    原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...

  5. Flutter学习笔记(23)--多个子元素的布局Widget(Rwo、Column、Stack、IndexedStack、Table、Wrap)

    如需转载,请注明出处:Flutter学习笔记(23)--多个子元素的布局Widget(Rwo.Column.Stack.IndexedStack.Table.Wrap) 上一篇梳理了拥有单个子元素布局 ...

  6. Flutter学习笔记(22)--单个子元素的布局Widget(Container、Padding、Center、Align、FittedBox、Offstage、LimitedBox、OverflowBox、SizedBox)

    如需转载,请注明出处:Flutter学习笔记(22)--单个子元素的布局Widget(Container.Padding.Center.Align.FittedBox.Offstage.Limited ...

  7. WPF学习笔记一 依赖属性及其数据绑定

    本文想通过由浅入深的讲解让读者比较深的理解依赖属性.  首先,我们回顾一下依赖属性的发展历史. 最初,人们提出面向对象编程时,并没有属性这个说法,当时叫做成员变量.一个对象由成员变量和成员函数组成,如 ...

  8. SpringMVC:学习笔记(5)——数据绑定及表单标签

    SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...

  9. WPF学习09:数据绑定之 Binding to List Data

    从WPF学习03:Element Binding我们可以实现控件属性与控件属性的绑定. 从WPF学习07:MVVM 预备知识之数据绑定 我们可以实现控件属性与自定义对象属性的绑定. 而以上两个功能在实 ...

随机推荐

  1. Immutable.js – JavaScript 不可变数据集合

    不可变数据是指一旦创建就不能被修改的数据,使得应用开发更简单,允许使用函数式编程技术,比如惰性评估.Immutable JS 提供一个惰性 Sequence,允许高效的队列方法链,类似 map 和 f ...

  2. Flexslider - 响应式的 jQuery 内容滚动插件

    FlexSlider 是一款轻量的响应式 jQuery 内容滚动插件,能够帮助你在项目轻松的创建漂亮的内容滚动效果.这款插件曾经连续多年入选 WDL 的年度最佳 jQuery 插件,值得大家在网站开发 ...

  3. getDate()返回日期不一致问题引发的bug

    问题描述 最近在webapp的开发中遇到一个Date对象中getDate获取日期的兼容性问题,Date对象的getDate方法返回的日期和传入的日期不一致,例如: 在android 4.3以下版本,g ...

  4. ie8不兼容rgba的解决

    借鉴................. 在调试ie8兼容性的问题时,发现ie8不支持rgba. 关于rgba(),即为颜色设置的方法函数,rgb代表颜色,a代表透明度. 如rgba(0,0,0,0.1 ...

  5. Android的消息循环机制 Looper Handler类分析

    Android的消息循环机制 Looper Handler类分析 Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...

  6. spring.net (2)环境搭建 对(1)例子的解释和扩充

    在上文中的例子实现了spring.net 控制反转的简单例子: 但是不免其中会有一些疑问. 例子中的配置文件是什么意思: app.config的配置规则可以参考web.config的配置详情 < ...

  7. socket编程中服务器端常用函数 以及简单实现

    1 常用函数 1.1   socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个 ...

  8. Linux 折腾汇集,实时更新

    一.Linux教程 入门教程:http://www.92csz.com/study/linux/ 命令大全:http://man.linuxde.net/ 一.界面: 在Ubuntu.Linux Mi ...

  9. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  10. Maven基础配置--nexus私服配置

    登录nexus私服后台,按照下图1-3的顺序进行添加仓库: 其中步骤3有三种仓库类型(Type)进行选择 1. Hosted Repository:本地仓库,在私服服务器上存放用户自行上传的jar包: ...