简单而言, 数据绑定是一种关系, 这种关系告诉WPF 从一个源目标对aded(object sender, RoutedEventArgs e) { Binding bind = new Binding(); bind.Source = s1; //指定源对象 bind.Mode = BindingMode.Default; //设置绑定模式 bind.Path = new PropertyPath("Value"); //关联绑定的属性 txtfont.SetBinding(TextBlock.FontSizeProperty, bind); //绑定对象 }
下面代码演示如何解除数据绑定:
private void Window_Loaded(object sender, RoutedEventArgs e) { //删除指定目标对象的 指定属性数据绑定 BindingOperations.ClearBinding(txtfont, TextBBYriRMRlock.FontSizeProperty); //删除指定目标对象的所有数据绑定 BindingOperations.ClearAllBindings(txtfont); }注意:以上的两个移除数据绑定的方法, 可以删除任何形式的绑定, 无论是代码创建的绑定还是通过XAML标记的绑定。
绑定更新:
在上面的示例中, 从 源对象 -> 目标对象, 源对象的值发生改变, 目标会立刻响应。但是从目标 > 源 , 未必会立即发生。
在WPF中,他们的行为右 binding中的 UpdateSourceTrigger属性控制, 关于UpdateSourceTrigger 下面列出了对应的枚举值
| propertyChanged | 当目标属性发生变化时立即更新源目标 |
| LostFocus | 当目标属性发生变化时并且目标丢失焦点是更新源目标 |
| Explicitwww.easck.com | 除非调用BindingExpression.UpdateSource()方法,否则无法更新资源 |
| Default | 根据目标属性的元数据确定更新行为, 大多数属性的默认行为是PropertyChanged, 但是TextBox.Text的属性默认行为是LoastFocus |
示例, 对于TextBox控件, 添加 UpdateSourceTrigger=PropertyChanged 以达到更新源目标, 但是往往在实际应用中, TextBox会频繁的变化, 从而导致多次更新源目标,
PropertyChenged更新反而会是应用程序运行更加缓慢, 要完全控制源对象的更新时机, 可以选择 Explicit模式, 例如, 添加一个按钮, 在按钮中调用UpdateSource方法已达到
更新的目的。
<TextBlock Grid.Row="1" Text="看着我" Name="txtfont"></TextBlock><TextBox Grid.Row="2" Margin="10" Text="{Binding ElementName=txtfont,Path=FontSize,UpdateSourceTrigger=PropertyChanged}"></TextBox>注:在调用UpdateSource之前, 需要通过GetBindingExpression()方法获取到BinBYriRMRdingExpression对象, 从而调用UpdateSource()方法。
private void Button_Click(object sender, RoutedEventArgs e) { BindingExpression exp = txtfont.GetBindingExpression(TextBlock.FontSizeProperty); exp.UpdateSource(); }非元素绑定:
在上面的例子中, 一直围绕着元素之间的绑定, 以及一些绑定的模式的介绍, 但是在我们的实际应用当中, 更多的是于数据打交道, 就像常见的Grid表格, 需要绑定对应数据库表的每个字段。
当绑定一个非元素对象时候, 这个时候就不能使用 ElementName属性, 在WPF中, 提供了多种属性以在实际应用中选择:
| Source | 提供数据的对象本身 |
| RelativeSource | 使用RelativeSource对象指向源目标, |
| DataContext | 从当前元素向下, 找到第一个非空的DataContext属性。 |
Source属性:
如下, 我们定义了一个Custom的资源对象, 同时创建了一个TextBlock对象用Source进行了对象绑定, 此时, TextBlock显示的Text则为Tom
<Window.Resources> <FontFamily x:Key="Custom">Tom</FontFamily> </Window.Resources> <StackPanel> <TextBlock Text="{Binding Source={StaticResource Custom},Path=Source}" Height="30"/> </StackPanel>RelativeSource属性:
如下, 定义了一个RelativeSource对象, Mdoe选择了FindAncestor(该模式通知元素直到发现AncestorType定义的元素类型,如下类型为 window),选择的Paht为title属性
<StackPanel> <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}},Path=Title}" Height="30"/> </StackPanel>DataContext属性:
TextBlock绑定了DataContext属性, WPF会在元素树种,找到第一个不为null的数据上下文, 此时后台需要对DataContext进行绑定指定的上下文对象。
<TextBlock Text="{Binding Width}"/>该示例种, 绑定了自身为上下文对象, 所有TextBlock找到的第一个Width属性为windows窗体本身的Width属性
private void Window_Loaded(object sender, RoutedEventArgs e) { this.DataContext = this; }到此这篇关于WPF实现数据绑定的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








