一、概述
①简单地说,数据绑定就是将源对象的属性绑定到目标对象的属性。
②源对象可以是任何内容,如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>
新闻热点
疑难解答