一、概述
①简单地说,数据绑定就是将源对象的属性绑定到目标对象的属性。
②源对象可以是任何内容,如WPF元素、ADO.NET对象或自行创建的纯数据对象。
③数据绑定的最简单情形是元素绑定,即源对象是WPF元素而且源属性是依赖项属性。因为依赖项属性具有内置的更改通知支持。因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性。
二、绑定表达式
<TextBlock Margin="10" Name="lblSampleText" FontSize="{Binding ElementName=sliderFontSize, Path=Value}" Text="Simple Text"> </TextBlock> ①绑定表达式使用XAML标记扩展(因此具有花括号)。 ②绑定表达式以单词Binding开头。元素到元素的绑定需配置两个属性:ElementName属性(指示源元素)和Path属性(指示源元素中的属性)。
三、绑定错误
当指定的元素或属性不存在时,WPF不会报错,只是不能在目标属性中显示数据。
四、绑定模式
绑定模式有五种,如下图。在应用时推荐明确设置绑定模式。
五、使用代码创建绑定
①在XAML标记中使用Binding标记扩展来声明绑定表达式通常最高效。然而也可以用代码创建绑定。
Binding binding = new Binding(); binding.Source = sliderFontSize; binding.Path = new PropertyPath("Value"); binding.Mode = BindingMode.TwoWay; lblSampleText.SetBinding(TextBlock.FontSizeProperty, binding); ②可以通过BindingOperation类的两个静态方法移除绑定。
ClearBinding()方法移除具体元素的具体依赖项属性的绑定
BindingOperations.ClearBinding(lblSampleText, TextBlock.FontSizeProperty); ClearAllBindings()方法移除具体元素的所有绑定 BindingOperations.ClearAllBindings(lblSampleText); ③不管是通过代码创建的绑定,还是通过XAML标记创建的绑定,都可以使用上面两个方法删除绑定。 ④通过代码创建绑定主要有以下应用场景:A:创建动态绑定
B:删除绑定
C:创建自定义控件(为了让他人更容易地修改自定义控件的外观,需要将特定细节(如事件处理程序和数据绑定表达式)从标记移到代码中。
六、使用代码检索绑定
可使用代码检索绑定并检查其属性,而不必考虑绑定最初是用代码还是标记创建的。有两种方式:
①通过BindingOperations.GetBinding()来检索对应的Binding对象。
假如有如下绑定:
<TextBlock Margin="10" Name="lblSampleText" FontSize="{Binding ElementName=sliderFontSize, Path=Value, Mode=TwoWay}" Text="Simple Text"> </TextBlock> 可使用以下代码获取绑定: Binding binding = BindingOperations.GetBinding(txtBound, TextBox.TextProperty); 通过绑定对象就可以查看其属性:
binding.ElementName:绑定源对象的名称
binding.Path:从绑定源对象提取的对应属性的值
binding.Path.Path:获取绑定源对象的绑定属性名称
binding.Mode:用于告知绑定何时更新目标元素 ②通过BindingOperations.GetBindingExpression()方法获取更实用的BindingExpression对象
BindingExpression expression = BindingOperations.GetBindingExpression(txtBound, TextBox.TextProperty); 通过BindingExpression对象可以查看如下属性:
expression.ResolvedSource:获取绑定对象的引用
expression.ResolvedSourcePropertyName:获取绑定源对象的绑定属性名称 七、绑定更新和绑定延迟
①建立绑定后源对象属性的变化会立即影响目标属性,然而,反方向的变化,即从目标到源不会立即发生。它受绑定的UpdateSourceTrigger属性控制。
②上图中列出的值不影响源到目标的更新,他仅能控制TwoWay或OneWayToSource模式中目标到源的更新。
③通过设置绑定的Delay属性可以延迟更新
<TextBox Name="txtBound" Text="{Binding ElementName=lblSampleText, Path=FontSize, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Delay=500} " Width="100"> </TextBox> 八、绑定到非元素对象 ①绑定到非元素对象时,只需要将绑定中的ElementName属性换成以下三个属性中的一个即可:
Source:指向数据对象
RelativeSource:可根据相对于目标对象的关系指向源对象(通过该属性可将元素绑定到自身或其父元素)。多用于编写控件模版或数据模版。
DataContext:如果绑定中没有使用Source或RelativeSource属性指定源,WPF就从当前元素开始在元素树中国向上查找。检查每个元素的DataContext属性,并使用第一个非空的DataContext属性。一般用于将大量元素绑定到同一个对象。
DataContext实例代码:
<StackPanel Margin="10" DataContext="{x:Static SystemFonts.IconFontFamily}"> <TextBlock Margin="5" Text="{Binding Path=Source}"></TextBlock> <TextBlock Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily}, Path=LineSpacing}"></TextBlock> <TextBlock Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily}, Path=FamilyTypefaces[0].Style}"></TextBlock> <TextBlock Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily}, Path=FamilyTypefaces[0].Weight}"></TextBlock> <TextBlock Margin="5" Text="{Binding Source={StaticResource CustomFont}, Path=Source}"></TextBlock> </StackPanel>
