WPF:数据绑定总结(1) https://segmentfault.com/a/1190000012981745
WPF:数据绑定总结(1)
1.3k 次阅读 · 读完需要 16 分钟
一、概念:什么是数据绑定?
WPF中的数据绑定:是在应用程序 UI 与业务逻辑之间建立连接的过程;
扩展:
- 为应用程序提供了一种表示数据和与数据交互的简单而又一致的方法。
- 元素能够以公共语言运行时 (CLR) 对象和 XML 的形式绑定到各种数据源中的数据。
- 数据绑定可能还意味着如果元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。
- 一种典型用法是将服务器或本地配置数据放置到窗体或其他 UI 控件中。在 WPF 中,元素的依赖项属性可以绑定到 CLR 对象(包括 ADO.NET 对象或与 Web 服务和 Web 属性相关联的对象)和 XML 数据XmlNode。
二、具体概念定义:
基础模型:
如上图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。
每个绑定的四个组件:绑定目标对象、目标属性(依赖项属性)、绑定源、绑定源值路径每个绑定的四个组件:绑定目标对象、目标属性(依赖项属性)、绑定源、绑定源值路径
数据流的方向
OneWay:绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。
1. 适用于绑定的控件为隐式只读控件的情况。
2. 可避免 TwoWay 绑定模式的系统开销
TwoWay:绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。
1. 此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。
OneWayToSource 与 OneWay 绑定相反。
1. 一个示例方案是您只需要从 UI 重新计算源值的情况。
OneTime 绑定未在图中显示,该绑定会导致源属性初始化目标属性,但不传播后续更改。
1. 使用当前状态的快照适合使用的或数据状态实际为静态的数据。
2. 如果要从源属性初始化具有某个值的目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。
3. 此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。
扩展:
1. 查看绑定方向:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。
2. 若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现一种合适的属性更改通知机制(如 INotifyPropertyChanged)
触发源的更新情况
绑定的 UpdateSourceTrigger 属性确定触发源更新的原因。
下表使用 TextBox 作为示例提供每个 UpdateSourceTrigger 值的示例方案:
三、创建绑定
指定绑定源
- 在元素上直接设置 DataContext 属性、从上级继承 DataContext 值(如第一个示例中的按钮)、
- 通过设置 Binding 上的 Source 属性来显式指定绑定源(如最后一个示例中的按钮),
- 还可以使用 ElementName 属性或 RelativeSource 属性指定绑定源。
指定值的路径
- 如果绑定源是一个对象,则可使用 Path 属性指定要用于绑定的值。
- 如果要绑定到 XML 数据,则可使用 XPath 属性指定该值。
- 在某些情况下,可以使用 Path 属性,即使在数据为 XML 时。 例如,如果要访问返回的 XmlNode(作为 XPath 查询的结果)的 Name 属性,则应使用 Path 属性和 XPath 属性。
Binding和BindingExpression
- Binding 类是用于绑定声明的高级别类;
- 相关类 BindingExpression 是维持源与目标之间的连接的基础对象。
- BindingExpression 是无法共享的实例表达式,其中包含有关 Binding 的所有实例信息。
- 可以通过对数据绑定对象调用 GetBindingExpression 的返回值来获取 BindingExpression 对象。
四、数据转换
通过实现 IValueConverter 接口来创建一个自定义转换器,在这些方案中,实现数据转换器是非常有意义的:
- 数据应根据区域性以不同方式显示。 例如,可能需要根据在特定区域性中使用的值或标准,来实现货币转换器或日历日期/时间转换器。
- 使用的数据不一定会更改属性的文本值,但会更改其他某个值(如图像的源,或显示文本的颜色或样式)。 在这种情况下,可以通过转换可能不合适的属性绑定(如将文本字段绑定到表单元格的 Background 属性)来使用转换器。
- 将多个控件或控件的多个属性绑定到相同数据。 在这种情况下,主绑定可能仅显示文本,而其他绑定则处理特定的显示问题,但仍使用同一绑定作为源信息。
- 对于 MultiBinding,可以使用自定义 IMultiValueConverter 从绑定的值生成最终值。 例如,可以从红色、蓝色和绿色的值来计算颜色,这些值可以是来自于相同或不同绑定源对象的值。
五、绑定到集合
绑定到数据集合是一个常见方案。 例如,一个常见方案是使用 ItemsControl(如 ListBox、 ListView 或 TreeView)来显示数据集合。
如何实现集合
- WPF 提供 ObservableCollection<T> 类,它是公开 INotifyCollectionChanged 接口的数据集合的内置实现。
- 如果您有高级方案并且希望实现自己的集合,请考虑使用 IList,它提供可以按索引逐个访问的对象的非泛型集合,因而可提供最佳性能。
集合视图
一旦 ItemsControl 绑定到数据集合,您可能希望对数据进行排序、筛选或分组。 若要执行此操作,可以使用集合视图,这是实现 ICollectionView 接口的类。
- 什么是集合视图
集合视图是位于绑定源集合顶部的一层,您可以通过它使用排序、筛选和分组查询来导航和显示源集合,而无需更改基础源集合本身。
ps:通过使用视图,可以通过多种不同的方式来显示相同数据。 例如,您可能希望在页面左侧显示按优先级排序的任务,而在页面右侧显示按区域分组的任务。
- 如何创建视图
创建和使用视图的一种方式是直接实例化视图对象并将其用作绑定源。
CollectionViewSource 类是继承自 CollectionView 的类的XAML代理。 视图的 Source 绑定到当前应用程序对象的 类型为 ObservableCollection<T>集合 。
若要为同一集合创建另一个视图,可以创建另一个 CollectionViewSource 实例并为其提供另一个 x:Key 名称。
- 使用默认视图
一个绑定控件或代码对默认视图所做的更改(如排序或对当前项指针的更改,下文将对此进行讨论)会反映在到同一集合的所有其他绑定中。
- 包含ADO.NET数据表的集合视图
- 为了提高性能,ADO.NET DataTable 或 DataView 对象的集合视图会将排序和筛选工作委托给 DataView。 这会导致排序和筛选工作由数据源的所有集合视图分担。
- 若要使每个集合视图都能独立进行排序和筛选,请用每个集合视图自己的 DataView 对象来初始化它。
排序
通过使用视图,可以应用这种用户驱动的排序,而无需对基础集合进行任何更改,甚至不必再次查询集合内容。 有关示例,请参见 如何:在单击标题时对 GridView 列进行排序。
listingDataView.SortDescriptions.Add(
new SortDescription("Category", ListSortDirection.Ascending));
筛选
视图还可以将筛选器应用于集合。
listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);
如果直接使用一个 CollectionView 类而不是 CollectionViewSource,则应使用 Filter 属性来指定回调。
分组
所有的集合视图都支持分组功能,用户可以利用此功能将集合视图中的集合划分成逻辑组。
当前项指针
- 由于 WPF 只通过使用视图(您指定的视图或集合的默认视图)绑定到集合,因此到集合的所有绑定都有一个当前项指针。 绑定到视图时,Path 值中的斜杠(“/”)字符用于指定视图的当前项。
- 当前项指针可能会受对集合应用的任何排序或筛选操作的影响。
主-从绑定方案
- 通过将两个或更多控件绑定到同一视图可以轻松地实现主-从方案。
六、数据模板化
见后续一章详述
七、数据验证
将验证规则与绑定关联
使用 WPF 数据绑定模型可以将 ValidationRules 与 Binding 对象相关联。
ValidationRule 对象可检查属性的值是否有效。 WPF 具有以下两种类型的内置 ValidationRule 对象:
- ExceptionValidationRule 检查在更新绑定源属性的过程中引发的异常。
- DataErrorValidationRule 对象检查由实现 IDataErrorInfo 接口的对象所引发的错误。
也可以通过从 ValidationRule 类派生和实现 Validate 方法来创建自己的验证规则。
提供视觉反馈
提供这种反馈的一种方式是将 Validation.ErrorTemplate 附加属性设置为自定义 ControlTemplate。
验证过程
目标的值传输到绑定源属性时通常会发生验证。 这种情况发生在 TwoWay 和 OneWayToSource 绑定上。
调试机制
可以在绑定相关对象上设置附加属性 PresentationTraceSources.TraceLevel 以接收有关特定绑定的状态的信息。
以上为官方帮助文档有关数据绑定主要内容,后续以主要示例详细展示,以加深印象。
WPF:数据绑定总结(1) https://segmentfault.com/a/1190000012981745的更多相关文章
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- WPF 数据绑定Binding
什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...
- 正则表达式(转自https://segmentfault.com/a/1190000000699097)
https://segmentfault.com/a/1190000000699097
- WPF数据绑定Binding(二)
WPF数据绑定Binding(二) 1.UI控件直接的数据绑定 UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上. ...
- WPF——数据绑定(一)什么是数据绑定
注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简 ...
- 剖析WPF数据绑定机制
引言 WPF框架采取的是MVVM模式,也就是数据驱动UI,UI控件(Controls)被严格地限制在表示层内,不会参与业务逻辑的处理,只是通过数据绑定(Data Binding)简单忠实地表达与之绑定 ...
- https://segmentfault.com/a/1190000004518374#articleHeader3
https://segmentfault.com/a/1190000004518374#articleHeader3 https://segmentfault.com/q/10100000049065 ...
- WPF 10天修炼 第十天- WPF数据绑定
WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件 ...
- https://segmentfault.com/a/1190000014637728
原网站地址:https://segmentfault.com/a/1190000009657295#articleHeader3 基于 vue2 + element-ui 构建的后台管理系统 vue. ...
随机推荐
- JavaScript性能优化篇js优化
JavaScript性能优化篇js优化 随着Ajax越来越普遍,Ajax引用的规模越来越大,Javascript代码的性能越来越显得重要,我想这就是一个很典型的例子,上面那段代码因为会被频繁使用, ...
- C++【vector】用法和例子
/*** * vector 基础api复习 * 8 AUG 2018 */ #include <iostream> #include <vector> using namesp ...
- kafka offset manage
kafka low api:fetch数据从topic partition offset buffsize长度. 提交一般两个维度:时间维度,满多少条提交(0.8X之前是没这参数) 在0.8.2.2版 ...
- 2019-5-21-Roslyn-使用-Directory.Build.props-管理多个项目配置
title author date CreateTime categories Roslyn 使用 Directory.Build.props 管理多个项目配置 lindexi 2019-05-21 ...
- redies安装
第一步下载redies 下载地址:https://github.com/microsoftarchive/redis/releases 第二步修改文件夹名为redies 第三步运行redies 打开一 ...
- 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法
1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...
- vbox虚拟机复制&&虚拟机指定静态IP
一.复制镜像(假设源镜像已经用桥接方式,可以访问互联网). 注意需要重新生成mac地址 二.复制完成,启动复制好的镜像(注意,此时的镜像无法联网) vi /etc/udev/rules.d/70-pe ...
- 20191004-gugugu公告
作者洗手不干了,所以以后可能会不写考试反思而是要写题解了…… ××这是$Day7$,于是我跪了 (不会,于是准备自己$YY$) 加油啊$LNC$你一定能$AK$的(雾 但是他因为太愧疚而没有打症结而是 ...
- JEECMS自定义标签开发步骤2
JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3'] <img src=&quo ...
- java填坑记录
一.The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the ...