WPF UpdateSourceTrigger属性
TextBox中的变化并不是立即传递到源,而是在TextBox失去焦点后,源才更新。这种表现由绑定中的UpdateSourceTrigger属性来控制。它的默认值是Default,源会根据你绑定的属性来更新。写这篇文章的时候,除了Text属性之外的所有属性,源会随属性的改变而立即更新。Text属性不一样,它只有在目标元素失焦后才更新。
UpdateSourceTrigger的默认值是Default,其他值有PropertyChanged、LostFocus和Explicit。前两个已经描述过了,最后一个是指必须通过手动推送来更新,通过调用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,然后手动更新,但是这个超出了数据绑定这一块的内容。
最新文章
- Struts2中的Ognl
- My Linux API
- R语言学习笔记:数据的可视化
- 开始android博客分享
- android网络编程之HttpUrlConnection的讲解--POST请求
- Swiper.js使用遇到的问题总结onSlideChangeEnd回调偶尔触发,偶尔不触发等;
- 自学Zabbix3.8.1.1-可视化Visualisation-Graphs简单图表
- 从MVC和三层架构说到SSH整合开发
- Kafka概述(一)
- 不定参数对arguments对象的影响
- openstack Q版部署-----环境搭建(1)
- [转].NET 性能测试工具 -- 事件跟踪器(ETW)
- Swift5 语言指南(十四) 下标
- chkconfig 管理系统服务
- I2C总线信号时序总结【转】
- UVa 10801 电梯换乘
- Java中的Runnable、Callable、Future、FutureTask的区别
- spring mvc: 可参数化的视图控制器(在配置中指定jsp文件)MultiActionController/SimpleUrlHandlerMapping/ParameterizableViewController
- CodeForces 288B Polo the Penguin and Houses (暴力或都快速幂)
- 分析并实现 360 P1路由器上的测速功能(也可以针对金山测速功能)