TextBox中的变化并不是立即传递到源,而是在TextBox失去焦点后,源才更新。这种表现由绑定中的UpdateSourceTrigger属性来控制。它的默认值是Default,源会根据你绑定的属性来更新。写这篇文章的时候,除了Text属性之外的所有属性,源会随属性的改变而立即更新。Text属性不一样,它只有在目标元素失焦后才更新。

UpdateSourceTrigger的默认值是Default,其他值有PropertyChangedLostFocusExplicit。前两个已经描述过了,最后一个是指必须通过手动推送来更新,通过调用UpdateSource

下面来看看上面这些选项是如何工作的,下面的例子由上一章的例子更新而来:

<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataContextSample" Height="130" Width="310">
<StackPanel Margin="15">
<WrapPanel>
<TextBlock Text="Window title: " />
<TextBox Name="txtWindowTitle" Text="{Binding Title, UpdateSourceTrigger=Explicit}" Width="150" />
<Button Name="btnUpdateSource" Click="btnUpdateSource_Click" Margin="5,0" Padding="5,0">*</Button>
</WrapPanel>
<WrapPanel Margin="0,10,0,0">
<TextBlock Text="Window dimensions: " />
<TextBox Text="{Binding Width, UpdateSourceTrigger=LostFocus}" Width="50" />
<TextBlock Text=" x " />
<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged}" Width="50" />
</WrapPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data; namespace WpfTutorialSamples.DataBinding
{
public partial class DataContextSample : Window
{
public DataContextSample()
{
InitializeComponent();
this.DataContext = this;
} private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
{
BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}
}
}

  

面三个文本框分别使用了不同的UpdateSourceTrigger

第一个使用的是Explicit,源不会更新除非你手动来操作。正因为这个原因,我在这个TextBox旁边添加了一个按钮,用于手动更新源。在后台代码中,我们看到点击事件处理方法里面只有两行代码,第一行获取目标控件的绑定,第二行调用UpdateSource()方法。

第二个使用的是LostFocus,对于Text绑定来说其实就是一个默认值。也就是说一旦目标控件失去焦点,源就会被更新。

第三个使用的是PropertyChanged,一旦绑定的属性值改变,源会立即更新。本例中文本改变就产生这种效果。

绑定的UpdateSourceTrigger属性用来控制改变的值何时传递给源。WPF很容易控制这些,一般情况下默认值足以应付大多数例子。你可以同时获得持续更新的UI和良好的性能。

在其他情况下,你需要使用更多的进程控制,这个属性将非常有用。记住很多你不更新源的地方,往往是需要被更新的。如果你想完全获得掌控权,那么使用Explicit,然后手动更新,但是这个超出了数据绑定这一块的内容。

最新文章

  1. Struts2中的Ognl
  2. My Linux API
  3. R语言学习笔记:数据的可视化
  4. 开始android博客分享
  5. android网络编程之HttpUrlConnection的讲解--POST请求
  6. Swiper.js使用遇到的问题总结onSlideChangeEnd回调偶尔触发,偶尔不触发等;
  7. 自学Zabbix3.8.1.1-可视化Visualisation-Graphs简单图表
  8. 从MVC和三层架构说到SSH整合开发
  9. Kafka概述(一)
  10. 不定参数对arguments对象的影响
  11. openstack Q版部署-----环境搭建(1)
  12. [转].NET 性能测试工具 -- 事件跟踪器(ETW)
  13. Swift5 语言指南(十四) 下标
  14. chkconfig 管理系统服务
  15. I2C总线信号时序总结【转】
  16. UVa 10801 电梯换乘
  17. Java中的Runnable、Callable、Future、FutureTask的区别
  18. spring mvc: 可参数化的视图控制器(在配置中指定jsp文件)MultiActionController/SimpleUrlHandlerMapping/ParameterizableViewController
  19. CodeForces 288B Polo the Penguin and Houses (暴力或都快速幂)
  20. 分析并实现 360 P1路由器上的测速功能(也可以针对金山测速功能)

热门文章

  1. 由于没有公钥,无法验证下列签名 Ubuntu
  2. SQL 从数据库中随机取n条数据
  3. Android Studio显示可视化编辑界面
  4. Redis安装与测试
  5. static修饰的方法不能被重写可以被继承
  6. 某种带权有向无环图(graph)的所有路径的求法
  7. React 组件模式
  8. Java反射与自定义注解
  9. centos7安装配置sql server 2017 linux教程
  10. 聊聊Postgres中的IPC之SI Message Queue