当前位置: 移动技术网 > IT编程>开发语言>c# > WPF基础教程之元素绑定详解

WPF基础教程之元素绑定详解

2019年07月18日  | 移动技术网IT编程  | 我要评论

前言

简单的说,数据绑定是一种关系,该关系告诉wpf从一个源对象提取一些信息,并使用这些信息设置目标对象的属性。目标属性总是以来属性,并且通常位于wpf元素中,毕竟,wpf数据绑定的最终目的是在用户界面中显示一些信息。然而,源对象可以是任何内容,从另一个wpf元素到ado.net数据对象(如datatable和datarow对象)或自己创建的纯数据对象。

下面话不多说了,来一起看看详细的介绍吧

元素绑定

数据绑定最简单的形式是源对象是wpf元素而且源属性是依赖项属性。依赖项属性具有内置的更改通知支持。因此当源对象中改变依赖属性的值时,会立即更新目标对象中的绑定属性。

绑定表达式

当使用绑定表达式时,不必对源对象做任何改动,只需配置源对象使其属性具有正确的值范围。

<slider grid.row="0" name="sliderfontsize" margin="3" minimum="1" maximum="40" value="10" tickfrequency="1" tickplacement="topleft"> 
</slider>
<textblock grid.row="1" margin="10" text="simple text" name="lblsimpletext"fontsize="{binding elementname=sliderfontsize,path=value}">   
</textblock>

绑定错误

wpf不会引发异常来通知与数据绑定相关的问题。如果指定的元素或属性不存在,那么不会收到任何的指示;相反,只是不能在目标属性中显示数据。

调试可通过visual studio的output窗口查看,wpf会输出绑定细节的跟踪信息。

绑定模式

名称 说明
oneway 当源属性变化时更新目标属性。
twoway 当源属性变化时更新目标属性,并且当目标属性变化时更新源属性。
onetime 最初根据源属性设置目标属性,然而,其后的所有改变都会被忽略。通常如果知道属性不会变化,可通过这种模式降低开销。
onewaytosource 与oneway相反,当目标属性变化时更新源属性。
default 此类绑定依赖于目标属性,既可以是双向的,也可以是单向的。除非明确指定了一种绑定模式,否则所有绑定使用该方法

使用代码创建绑定

binding binding = new binding();
binding.source = sliderfontsize;
binding.path = new propertypath("value");
binding.mode = bindingmode.twoway;
lblsimpletext.setbinding(textblock.fontsizeproperty,binding);

多绑定

可以设置textblock元素从文本框中获取文本,从单独的颜色列表中选择当前前景色和背景色,等等。

  <textblock grid.row="1" margin="10" name="lblsimpletext"
     fontsize="{binding elementname=sliderfontsize,path=value}"
     text="{binding elementname=txtcontent,path=text}"
     foreground="{binding elementname=lstcolors,path=selecteditem.tag}"> 
  </textblock>

还可链接数据绑定。例如textbox.text属性创建表达式以链接到textblock.fontsize属性,而textblock.fontsize又链接到slider.value属性的绑定表达式。

绑定更新

源的变化会立即影响目标,然而反向的传递从目标到源未必会立即发生。他们的行为由binding.updatesourcetrigger属性控制。


名称
说明
propertychanged 当目标属性变化时立即更新源。
lostfocus 当目标属性变化并且目标属性失去焦点时跟新源。
explicit 除非调用bindingexpression.updatesource()方法,否则无法更新源。
default 根据目标属性的元素确定更新行为。大多数属性的默认行为是propertychanged,但textbox.text属性的默认行为是lostfocus

表中列出的值不影响目标的更新方式,他们仅控制oneway或onewaytosource模式的绑定中源的更新方式。

绑定延迟

用户停止输入500毫秒后更新源对象

<textbox text="{binding elementname=txtsampletext,path=fontsize,mode=twoway,updatesourcetrigger=propertychanged,delay=500}" name="txtfontsize">
</textbox>

绑定到非元素对象

wpf数据绑定基础结构不能获取私有信息或公有字段,必须是公有属性中。

绑定到非元素对象时,需要放弃binding.elementname属性,并使用以下属性之一。

  • source:该属性是指向源对象的引用,提供数据的对象。
  • relativesource:这是引用,使用relativesource对象指向源对象。有了这个附加层,在在当前元素的基础上构建引用。这似乎增加了复杂程度,

但实际上relativesource属性是一种特殊工具,当编写控件模版及数据模版时是很方便的。

  • datacontext:如果没有使用source或relativesource属性指定源,wpf就从当前元素开始在元素树中向上查找。检查每个属性的datacontext属性,并使用第一个飞空的datacontext属性。

当将同一个对象的多个属性绑定到不同的元素时,datacontext属性是非常有用的,因为可在更高层次的容器对象上,设置datacontext属性。

source

绑定到静态对象

 <textblock text="{binding source={x:static systemfonts.iconfontfamily},path=source}"></textblock>

2.绑定到资源

 <window.resources>
  <fontfamily x:key="coustomfont">calibri</fontfamily>
 </window.resources>
 <grid>
  <textblock text="{binding source={staticresource coustomfont},path=source}"></textblock>
 </grid>

relativesource

<textblock text="{binding path=title,relativesource={relativesource findancestor,ancestortype={x:type window}}}"></textblock>

relativesource对象使用findancestor模式,该模式告知查找元素树知道发现ancestortype属性定义的元素类型。
findancestor模式有4种。

名称                 
说明
self 表达式绑定到同一元素的另一个属性上。
findancestor 表达式绑定到父元素。wpf将查找元素树直至发现期望的父元素。为了指定父元素,还必须设置ancestortype属性以指示希望查找的父元素类型。此外,还可以用ancestorlevel属性略过发现的一定的数量的特定元素。例如当一棵树中查找时,如果希望绑定到第三个listboxitem类型的元素,应当使用如下设置,ancestortype={x:type listboxitem};并且ancestorlevel=3,从而略过前连个listboxitem元素。默认值是1,并在找到第一个匹配的元素停止查找。
previousdata 表达式绑定到数据绑定列表中前一个数据项。在列表中使用这种模式。
templateparent 表达式绑定到应用模版的元素。只有当绑定位于控件模版或数据模版内部时,这种模式才能工作。

datacontext属性

大量元素绑定到同一对象。

<textblock text="{binding source={x:static systemfonts.iconfontfamily},path=source}"></textblock>
 <textblock text="{binding source={x:static systemfonts.iconfontfamily},path=source}"></textblock>
 <textblock text="{binding source={x:static systemfonts.iconfontfamily},path=source}"></textblock>

可以改成如下

<stackpanel datacontext="x:static systemfonts.iconfontfamily">
  <textblock text="{binding path=source}"></textblock>
  <textblock text="{binding path=source}"></textblock>
  <textblock text="{binding path=source}"></textblock>
 </stackpanel>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网