WPF基础教程之元素绑定详解
前言
简单的说,数据绑定是一种关系,该关系告诉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>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对猪先飞的支持。
相关文章
- 这篇文章主要介绍了jQuery事件绑定用法,结合实例形式较为详细的分析了jQuery事件绑定的实现原理与相关注意事项,并附带了相关绑定方法的使用说明,重点介绍了bind和live的区别,需要的朋友可以参考下...2016-01-21
c# WPF中通过双击编辑DataGrid中Cell的示例(附源码)
这篇文章主要介绍了c# WPF中通过双击编辑DataGrid中Cell的示例(附源码),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-03-03- 有时候我们需要屏蔽客户端的F12,以防菜鸟也可以随意修改我们的代码,也处于源码的保护等操作,这里就为大家分享一下常见的代码...2020-10-03
- 这篇文章主要为大家详细介绍了jQuery实现HTML元素隐藏和显示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-19
- 最近在网上看到了新版的360安全卫士,感觉界面还不错,于是用WPF制作了一个,时间有限,一些具体的控件没有制作,用图片代替了。感兴趣的朋友一起跟着小编学习WPF实现类似360安全卫士界面的程序源码分享...2020-06-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 下面小编就为大家带来一篇javascript中去除数组重复元素的实现方法【实例】。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2016-04-16
- 这篇文章主要介绍了JavaScript为事件句柄绑定监听函数的方法,结合实例详细分析了常见的事件句柄绑定监听函数的实现技巧,并实例讲解了跨浏览器的实现方法,需要的朋友可以参考下...2015-12-17
- vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,下面这篇文章主要给大家介绍了关于如何利用js实现Vue2.0中数据的双向绑定功能的相关资料,需要的朋友可以参考下...2021-07-19
- 这篇文章主要为大家详细介绍了C# TextBox数据绑定的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了Vue2.x 的双向绑定原理,Vue 是利用的 Object.defineProperty() 方法进行的数据劫持,利用 set、get 来检测数据的读写。需要的朋友可以参考下面文章的具体内容...2021-09-27
详解JavaScript的AngularJS框架中的作用域与数据绑定
这篇文章主要介绍了JavaScript的AngularJS框架中的作用域与数据绑定,包括作用域的继承以及数据的单向和双向绑定等重要知识点,需要的朋友可以参考下...2016-03-07- 这篇文章主要介绍了C#移除所有事件绑定的方法,实例分析了C#事件绑定的移除方法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要给大家介绍了关于Javascript循环删除数组中元素的几种方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。...2017-05-22
- 这篇文章主要为大家详细介绍了WPF仿三星手机充电界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了C# WPF 通过委托实现多窗口间的传值的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 下面小编就为大家分享一篇c#实现获取字符串阵列中元素最长或最短的长度方法,具有很好的参考价值,希望对大家有所帮助...2020-06-25
- 这篇文章主要为大家详细介绍了WPF TextBox实现按字节长度限制输入功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要给大家介绍了关于利用JS十分钟判断数组中存在元素的多种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-05
- 这篇文章主要介绍了C#中WPF使用多线程调用窗体组件的方法,涉及C#中多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25