第8章 元素绑定(1)——概述、创建设置绑定和绑定到非元素对象

来源:互联网 发布:小型公司网络规划方案 编辑:程序博客网 时间:2024/06/15 14:36

一、概述

①简单地说,数据绑定就是将源对象的属性绑定到目标对象的属性。

②源对象可以是任何内容,如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>


0 0
原创粉丝点击