欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF绑定实例详解

程序员文章站 2024-02-11 20:18:46
本文详细讲述了wpf绑定的用法,分享给大家供大家参考。具体用法分析如下: 1.wpf绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表...

本文详细讲述了wpf绑定的用法,分享给大家供大家参考。具体用法分析如下:

1.wpf绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了xaml扩展标记,wpf绑定一个控件是使用binding.elementname,绑定非控件对象时使用source,relativesource,datacontext属性(wpf特有,而非xaml),只能绑定对象的共有字段.
下边是部分binding 属性名,完整列表参考 :http://msdn.microsoft.com/zh-cn/library/vstudio/ms750413.aspx

① source:数据提供者
② relativesource:根据当前对象为基础,自动查找源并绑定
③ datacontext:如果未使用source和relativesource,wpf就从当前控件开始在控件树种向上查找,并使用第一个非空的datacontext属性,可以在更高层次容器对象上设置datacontext,如下代码 text 绑定到 source属性,但未设置text的绑定对象,会向上查找datacontext绑定的对象的source属性
④ 示例代码:

<stackpanel datacontext="{x:static systemfonts.iconfontfamily}"> 
    <textbox margin="5" text="{binding path=source}">
    </textbox> 
</stackpanel>
<textblock margin="3" name="lblsampletext" 
fontsize="{binding elementname=sliderfontsize,path=value mode="twoway"}"
text="{binding elementname=txtcontent,path=text}" foreground="{binding elementname=lstcolors,path=selecteditem.tag}" ></textblock>

也可是使用代码创建绑定:

binding binding = new binding();
 binding.source = sliderfonsize;  
 binging.path=new propertpath("value") 
 binding.mode=bindignmode.twoway;
 txt.setbinding(textblock.fontsize,binding)

2.bindingmode的枚举值有:

① oneway
② twoway
③ onetime:根据源端属性值设置目标属性值,之后的改变会被忽略,除非调用bindingexpression.updatetarge方法
④ onewaytosource:与oneway类似,但方向相反,用于目标属性是非依赖项属性的情况
⑤ default:默认值,根据目标属性确定绑定类型.依赖项属性都由一个元数据 frameworkpropertymetadata.bindstwowaybydefault用于标识oneway绑定还是twoway绑定

3.从目标到绑定源端数据更新时(binding mode为twoway或者onewaytosource),更新行为(什么时机更新)由binding.updatesourcetrigger枚举属性控制,updatesourcetrigger的值有:

① propertychanged:目标属性发生变化时立即更新

② lostfocus:目标属性发生变化并且目标丢失焦点时更新源

③ explicit:除非调用bindingexpression.updatesource()方法,否则无法更新

④ default:根据目标属性的元数据(frameworkpropertmetadata.defaulupdatesourcetrigger)确定更新行为,大多数属性默认行为是propertychanged

4.multibinding:将多个对象绑定到一个控件,主要要使用stringformat

<listbox itemssource="{staticresource mydata}"> 
<listbox.itemtemplate> 
<datatemplate> 
<textblock>
<textblock.text> 
<multibinding stringformat="{}{0} -- now only {1:c}!">
<binding path="description"/> <binding path="price"/> </multibinding> 
</textblock.text> 
</textblock> 
</datatemplate>
</listbox.itemtemplate> 
</listbox>

5.objectdataprovider:从另一个类中获取信息,只用于数据查询,isasynchronous=true,可以使objectdataprovider在后台执行,这样即使发生异常不会影响绑定控件的显示:

<objectdataprovider x:key="productsprovider" objecttype="{x:type local:storedb}"
methodname="getproducts"></objectdataprovider>

6.wpf中派生自itemscontrol的类都能显示列表,能够支持集合数据绑定的元素包括listbox,combobox,listview和datagrid,menu,treeview,itemscontrol中有三个重要属性:

① itemssource: 指向一个集合,结合必须支持ienumerable接口,该集合包含将在列表中显示的所有元素,但基本的ienumerable接口只支持只读绑定,要使修改能直接反应到绑定的控件上需要使用observablcollection类
② displaymemberpath:确定用于显示的 对象的属性,如果未设置 则会显示对象的tostring()方法返回的值
③ itemtemplates:接受一个数据模板,用于为每个项创建可视化外观

7.继承自ienumerable接口的类型都支持绑定到列表形元素,大多数集合类没有继承inotifycollectionchanged接口,wpf提供了一个使用inotifycollectionchanged接口的集合,observablecollction类

8.将grid绑定到lstproducts对象的selectitem属性

<grid datacontext="{binding elementname=lstproducts,path=selecteditem}">....</grid>

9.绑定时,被绑定的数据对象可能还不存在(绑定控件对象时可以看该对象在xaml中是否已经定义),这时依然可以在xaml中绑定对象类属性(binding path),然后在代码中生成数据对象后在与控件绑定

10.wpf列表控件提供了ui虚拟化(ui virtualization)功能用于提高大列表的性能,ui虚拟化是列表仅为当前显示项创建容器对象的一种技术

11.数据验证:用于捕获非法数据

① exceptionvalidationrule验证:验证失败时,wpf会在绑定元素上将validation.haserror设置为true,wpf自动将控件使用的模板切换到又validation.errortemplate定义的模板,创建包含错误细节的validationerror对象,并加到validation.errors集合中,如果binding.notifyonvalidationerror属性设置为true,wpf就会在控件上引发validation.error事件

② idataerrorinfo类:在数据对象中引发错误,并且要在binding中设置dataerrorvalidationrule验证规则,当修改了一个属性后,idataerrorinfo中的字符串索引器,以属性名为key对值进行验证。可以自定义验证类并响应验证错误

12.没有path的binding:binding源本身就是数据且不需要path来指明,如下绑定表示将text绑定到字符串类型mystring,mystring本身就是数据.path后为"."或者空表示绑定source本身:

<textblock text="{binding source={staticresource resourcekye=mystring},path=.}">

相信本文所述对大家c#程序设计的学习有一定的借鉴价值。