Wpf基础入门——绑定Binding篇

发布时间 2023-05-29 21:01:48作者: Swbna

本篇文章学习于: 刘铁猛老师《深入浅出WPF》

Bing基础

Binding更注重表达它是一种像桥梁一样的关联关系。WPF中,正是在这段桥梁上我们有机会为往来流通的数据做很多事情。
如果把Binding比作数据的桥梁,那么它的两端分别是Binding的源(Source)和目标(Target)。
一般情况下,Binding源是逻辑层的对象,Binding 目标是UI层的控件对象,这样,数据就会源源不断通过Binding送达UI层、被UI层展现,也就完成了数据驱动UI的过程。
Binding模型

Binding的源与路径

Binding的源也就是数据的源头。Binding对源的要求并不苛刻——只要它是一个对象,并且通过属性(Property)公开自己的数据,它就能作为Binding的源。

把控件作为绑定源与Binding标记扩展

image.png

控制Binding的方向及数据更新

Binding在源与目标之间架起了沟通的桥梁,默认情况下数据既能够通过Binding送达目标,也能够从目标返冋源(收集用户对数据的修改)。有时候数据只需要展示给用户、不允许用户修改,这时候可以把Binding模式更改为从源向目标的单向沟通。Binding还支持从目标向源的单向沟通以及只在Binding关系确立时读取一次数据,这需要我们根据实际情况去选择。
控制Binding 数据流向的属性是Mode , 它的类型是BindingMode 枚举。BindingMode 可取值为 TwoWay、OneWay、OnTime、OneWayToSource 和 Default。
这里的 Default 值是指 Binding 的模式会根据目标的实际情况来确定,比如若是可编辑的(如TextBox.Text属性),Default就采用双向模式;若是只读的(TextBlock.Text)则采用单向模式。
image.png
image.png

Binding的路径(Path)

作为Binding源的对象可能有很多属性,通过这些属性Binding源可以把数据暴露给外界。那么,Binding到底需要关注哪个属性的值呢?这就需要由Binding的Path属性来指定了。

  • Binding还支持多级路径(通俗地讲就是一路“点”下去)。
  • 集合类型的索引器(Indexer)又称为带参属性。既然是属性,索引器也能作为Path来使用
  • 当使用一个集合或者DataView作为Binding源时,如果我们想把它的默认元素当作Path使用,则需要使用:

image.png

  • 如果集合元素的属性仍然还是一个集合,我们想把子级集合中的元素当作Path,则可以使用多级斜线的语法(即一路“斜线”下去)

image.png

没有“Path”的Binding

有的时候我们会在代码中看到一些Path是一个“.”或者干脆没有Path的Binding,着实让人摸不着头脑。原来,这是一种比较特殊的情况一Binding源本身就是数据且不需要Path来指明。
典型的,string, int等基本类型就是这样,他们的实例本身就是数据,我们无法指出通过它的哪个属性来访问这个数据,这时我们只需将Path的值设置为“.”就可以了。在XAML代码里这个"."可以省略不写,但在C#代码里却不能省略。
image.png

为Binding指定源(Source)的几种方法

Binding的源是数据的来源,所以,只要一个对象包含数据并能通过属性把数据暴露出来,它就能当作Binding的源来使用。包含数据的对象比比皆是,但必须为Binding的Source指定合适的对象Binding才能正确工作
如下:
(1)没有 Source 的 Binding------- 使用 DataContext 作为 Binding 的源
(2)使用集合对象作为列表控件的ItemsSource
(3)使用ADO.NET对象作为Binding的源
(4)使用XML数据作为Binding的源
(5)使用LINQ检索结果作为Binding的源
(6)使用ObjectDataProvider对象作为Binding的源
(7)使用Binding的RelativeSource

Binding对数据的转换与校验

Binding的作用就是架在Source与Target之间的桥梁,数据可以在这座桥梁的帮助下来流通。不仅如此,当Binding两端要求使用不同的数据类型时,我们还可以为数据设置转换器。
Binding用于数据有效性校验的关卡是它的ValidationRules属性,用于数据类型转换的关卡是它的Converter属性

MultiBinding (多路 Binding )

有的时候UI要需要显示的信息由不止一个数据来源决定,这时候就需要使用MultiBinding,即多路Binding。 MultiBinding与Binding 一样均以BindingBase为基类,也就是说,凡是能使用Binding对象的场合都能使用MultiBinding。
MultiBinding 示意图

image.png