介绍了绑定元素的基本概念,绑定错误,绑定模式,绑定更新,绑定延迟等。同时介绍了3种绑定元素的方法,包括Source方法,RelativeSource方法,DataContext方法。
1.绑定元素
1.1绑定方法
- xaml绑定
- 绑定语法:{Binding ElementName=sliderFontSize, Path=Value}
- 下例中将slider的value属性绑定到TextBlock的Fontsize属性上。设置了ElementName和Path(path可以指向属性的属性(如FontFamily.Source),也可以指向属性使用的索引器(如Content.Children[0]),可指向多级层次的路径)。
- 代码绑定
- 代码绑定一般在特殊情况下使用,比如。
- 创建动态绑定:如果希望根据其他运行时信息修改绑定,或者根据环境创建不同的绑定,这时使用代码创建绑定通常更合理(此外,也可在窗口的Resources集合中定义可能希望使用的每个绑定,并只添加使用合适的绑定对象调用SetBinding()方法的代码)。
- 删除绑定:如果希望删除绑定,从而可以通过普通方式设置属性,需要借助ClearBinding()或ClearAllBindings( )方法。仅为属性应用新值是不够的——如果正在使用双向绑定,设置的值会传播到链接的对象,并且两个属性保持同步。
- 创建自定义控件:为让他人能更容易地修改您构建的自定义控件的外观,需要将特定细节(如事件处理程序和数据绑定表达式)从标记移到代码中。第18章提供了一个自定义的颜色拾取控件,该控件使用代码创建绑定。
- 不管绑定是通过代码应用的,还是使用XAML标记应用的,都可以使用ClearBinding()和ClearAllBindings()方法删除任何绑定。
- 上例中的绑定可以采用代码的形式,但通常不常用。还可通过ClearBinding方法使用依赖属性的引用作为参数,使用ClearAllBindings方法为元素删除所有数据绑定。
- 代码绑定一般在特殊情况下使用,比如。
Binding binding = new Binding();
binding.Source=sliderFontSize;
binding.Path = new PropertyPath("Value");
binding.Mode = BindingMode.TwoWay;
lblSampleText.SetBinding(TextBlock.FontSizeProperty, binding);
-
代码检索绑定:使用Bindingoperations.GetBinding()。
-
多绑定,一个元素可以设置多个属性都是绑定属性。也可以一个属性与多个值进行绑定(间接),如下例,通过文本框和Slider都可以改变字体大小。但有个问题就是文本框输入完成后需要将鼠标焦点移到其他控件上才能起作用(后面有解决方法)。
1.2绑定错误
后续补充。
1.3绑定模式
- 同一个控件当既要通过代码修改,又要通过界面绑定修改时,可能有2种方法。
- 需要设置双向绑定(Mode=TwoWay)。
- 代码直接更改被绑定控件的值,比如本例中的Slider的value值。
- 绑定模共有5个,来自System. Windows.Data.BindingMode枚举。
- OneWay:当源属性变化时更新目标属性。
- TwoWay:当源属性变化时更新目标属性,并且当目标属性变化时更新源属性。
- OncTime:最初根据源属性值设置目标属性。然而,其后的所有改变都会被忽略(除非绑定被设置为一个完全不同的对象或者调用BindingExpression.UpdateTarget()方法,正如稍后介绍的那样)。通常,如果知道源属性不会变化,可使用这种模式降低开销。
- OneWayToSource:与OnWay类型类似,但方向相反。当目标属性变化时更新源属性(这看起来有点像向后传递),但目标属性永远不会被更新。
- Default:此类绑定依赖于目标属性。既可以是双向的(对于用户可以设置的属性,如TextBox.Text属性),也可以是单向的(对于所有其他属性)。除非明确指定了另一种模式,否则所有绑定都使用该方法。
1.4绑定更新
- 针对于上面的多绑定,数据无法实时更新的问题,可使用Binding.UpdateSourceTrigger更新。{Binding ElementName=lblSampleText ,Path=FontSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
1.5绑定延迟
- 为避免频繁更新,可使用绑定延迟。绑定时增加Delay=500等。
2.绑定非元素
绑定非元素时,常用的属性为Source,RelativeSource,DataContext。
2.1Source方法
- Source:该属性是指向源对象的引用——换句话说,是提供数据的对象。
- 非常简单,但需要数据对象(3种途径:可从资源中提取,可通过编写代码生成,可在数据提供程序的帮助下获取)。
- 最简单的是直接指向一些准备好的静态对象。(可在代码中创建一个静态对象,可使用来自.NET类库的组件)。如下例
-
<TextBlock Width="200" Height="30" Text="{Binding Source={x:Static SystemFonts.IconFontFamily}}"/>
- 选择绑定到先前作为资源创建的对象。
-
// App.xaml代码 <Application.Resources> <FontFamily x:Key="CustomFont">Calibri</FontFamily> </Application.Resources> // MainWindow.xaml代码 <TextBlock Width="200" Height="30" Text="{Binding Source={StaticResource CustomFont},Path=Source}"/>
2.2RelativeSource方法
- RelativeSource:这是引用,使用RelateveSource对象指向源对象。有了这个附加层,可在当前元素(包含绑定表达式的元素)的基础上构建引用。这似乎无谓地增加了复杂程度,但实际上,RelativeSource属性是一种特殊工具,当编写控件模板以及数据模板时是很方便的。
- 使用RelativeSource绑定
-
<TextBlock Text="{Binding Path=Title, RelativeSource={RelativeSource AncestorType={x:Type Window}}}">
2.3DataContext方法
- DataContext:如果没有使用Source或 RelativeSource属性指定源,WPF就从当前元素开始在元素树中向上查找。检查每个元素的DataContext属性,并使用第一个非空的DataContext属性。当我要将同一个对象的多个属性绑定到不同的元素时,DataContext属性是非常有用的,因为可在更高层次的容器对象上(而不是直接在目标元素上)设置DataContext属性。
- 可使用和设置Binding.Source属性相同的方法设置元素的DataContext属性<StackPanel DataContext={"x:Static SystemFonts.IconFontFamily}">
- 设置完成后就可以在StackPanel的所有子元素上通过精简的方式进行绑定<TextBlock Margin="5" Text="{Bingding Path=Source}">