• 星空雅梦


    WPF教程(三)UpdateSourceTrigger属性

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

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

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

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

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

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

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

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

    请尝试在自己的电脑上运行上面的例子,来观察这三个文本框有哪些区别:第一个文本框的值在你点击按钮之前不会改变,第二个在你离开这个文本框时才改变,第三个敲下键盘就会自动更新。

    总结

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

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

  • 相关阅读:
    《剑指offer》第六十八题(树中两个结点的最低公共祖先)
    《剑指offer》第六十七题(把字符串转换成整数)
    《剑指offer》第六十六题(构建乘积数组)
    《剑指offer》第六十五题(不用加减乘除做加法)
    ECShop 2.7.2版本,数据库表
    织梦在导航栏下拉菜单中调用当前栏目子类的方法
    让dedecms autoindex,itemindex 从0到1开始的办法!
    dedeCMS列表页中如何给前几条文章加单独样式?
    dedecms标签调用大全
    完美解决ecshop与jquery冲突兼容
  • 原文地址:https://www.cnblogs.com/LiZhongZhongY/p/10870347.html
Copyright © 2020-2023  润新知