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#程序设计的学习有一定的借鉴价值。

(0)

相关推荐

  • WPF制作一个简单的倒计时器实例附源码

    实例一: 早上起来后闲的无事,于是想到前些日子学院的某个老师让大家给他找个什么倒计时的小软件,当时大家忙于复习所以也懒得搭理这件事,囧~.既然早上没事干,何不写个玩玩~既然要写,就用以前没怎么捣鼓过的WPF写一个吧,也算是一次学习WPF的初探吧(感觉自己很落后了)! 在Vs2008和Vs2010之间徘徊了许久之后,最终还是选择了Vs2008做开发IDE.在Vs2008中建了个WPF工程后,浏览了下默认生成的工程文件结构,一个App.xaml(当然还有App.xaml.cs)和一个Windows1

  • 仿vs实现WPF好看的进度条

    为了界面友好,一般的操作时间较长时,都需要增加进度条提示.由于WPF自带的进度条其实不怎么好看,而且没啥视觉效果.后来,装VS2012时,发现安装过程中进度条效果不错,于是上网查了资料.学习了ModernUI(开源的),地址:https://github.com/firstfloorsoftware/mui. 后来,做了尝试写了个Demo,效果不错.另外,专门录制了tif文件,方便大家看到效果.废话不多说,先展示效果: 一.效果展示 A.VS2012安装界面图: B.个人尝试Demo效果图: 二

  • WPF实现渐变淡入淡出的登陆窗口效果

    本文实例讲述了WPF实现渐变淡入淡出的登陆窗口效果的方法.分享给大家供大家参考.具体实现方法如下: 1.实现原理 ① 利用UIElement.OpacityMask属性,用于改变对象区域的不透明度的画笔.可以使元素的特定区域透明或部分透明,从而实现比较新颖的效果. ② OpacityMask属性接受任何画刷,可利用LinearGradientBrush线性渐变画刷,通过对渐变画刷中各颜色点加以动画处理即可. 2.渐变淡入实现 渐变淡入效果,可通过事件触发器触发Loaded事件实现,所以可以仅用前

  • 关于.NET/C#/WCF/WPF 打造IP网络智能视频监控系统的介绍

    OptimalVision网络视频监控系统 OptimalVision(OV)网络视频监控系统(Video Surveillance System),是一套基于.NET.C#.WCF.WPF等技术构建的IP网络视频监控系统.设计与实现该系统的初衷是希望在家用电脑中部署该系统,连接本地或局域网设备,通过浏览器或手机客户端浏览宝宝实时视频,也就是俗称的"宝宝在线"或"家庭看护". 但由于业余时间总是有限,完成系统中的服务.配置.采集.传输和桌面GUI部分后,继续完成后续

  • 在WinForm和WPF中使用GMap.Net地图插件简单教程

    如何在WinForm中使用GMap.Net 项目主页:https://greatmaps.codeplex.com/ 下载GMap.Net,我下载的版本:greatmaps_81b71bf30091,编译三个核心项目: GMap.Net.Core:核心DLL GMap.Net.WindowsForms:WinForm中使用的DLL GMap.NET.WindowsPresentation:WPF中使用的DLL 在WinForm项目中使用GMap: 1.新建一个Visual C# 的Windows

  • WPF的数据绑定详细介绍

    一.WPF数据绑定的概要 数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改. 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改. 例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改. 1. 数据绑定涉及到两个方面: 一个是绑定源,一个是绑定目标.绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件. 2. 对

  • WPF字体或内容模糊的解决方法

    本文会给大家介绍尝试过的一些方法,大家可以一起看看. 1.用WPF4.0中的新字体渲染方法,没有改善 <Setter Property="TextOptions.TextFormattingMode" Value="Display" /> <Setter Property="TextOptions.TextRenderingMode" Value="ClearType" /> 2.给控件加上SnapsT

  • wpf将表中数据显示到datagrid示例

    a.在.xaml文件中拖入一个datagrid,然后添加列名,使用Binding="{Binding 数据库中的列名称}",如下:  复制代码 代码如下: <DataGrid AutoGenerateColumns="False" Height="438"HorizontalAlignment="Left" Margin="23,278,0,0" Name="dataGrid1" 

  • 在Winform和WPF中注册全局快捷键实现思路及代码

    快捷键辅助类 复制代码 代码如下: class HotKey { /// <summary> /// 如果函数执行成功,返回值不为0. /// 如果函数执行失败,返回值为0.要得到扩展错误信息,调用GetLastError..NET方法:Marshal.GetLastWin32Error() /// </summary> /// <param name="hWnd">要定义热键的窗口的句柄</param> /// <param na

  • 关于WPF异步MVVM等待窗体的介绍

    需求描述•在ViewModel中处理Model中的数据需要一定时间的等待•ViewModel或Model在获取数据或访问同步服务时有一定延迟需要等待•ViewModel操作View加载数据需要一段时间解决办法•显示一个等待UI,当数据处理完毕或服务接口返回后等待UI消失转动齿轮控件•参考开源实现SprocketControl :http://wpfspark.codeplex.com/等待控件 复制代码 代码如下: <Grid>     <local:SprocketControl Gr

随机推荐