一、概念:什么是数据绑定?
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 以接收有关特定绑定的状态的信息。
以上为官方帮助文档有关数据绑定主要内容,后续以主要示例详细展示,以加深印象。