如何控制 TextBox 文本更新源的时机

本主题介绍如何使用 UpdateSourceTrigger 属性来控制绑定源更新的计时。 本主题使用 TextBox 控件作为示例。

TextBox.Text 属性的默认 UpdateSourceTrigger 值为 LostFocus。 这意味着,如果一个应用程序的 TextBox 具有数据绑定的 TextBox.Text 属性,那么在 TextBox 失去焦点之前,你在 TextBox 输入的文本不会更新数据源(例如,当你点击离开 TextBox时)。

如果要在键入时更新源,请将绑定 UpdateSourceTrigger 设置为 PropertyChanged。 在以下示例中,突出显示的代码行表明 TextBoxTextBlockText 属性绑定到同一个源属性。 TextBox绑定的UpdateSourceTrigger属性设置为PropertyChanged

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:src="clr-namespace:SDKSample"
  xmlns:system="clr-namespace:System;assembly=mscorlib"
  SizeToContent="WidthAndHeight"
  Title="Simple Data Binding Sample">

  <Window.Resources>
    <ObjectDataProvider x:Key="myDataSource" ObjectType="{x:Type src:Person}">
      <ObjectDataProvider.ConstructorParameters>
        <system:String>Joe</system:String>
      </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
    <Style TargetType="{x:Type Label}">
      <Setter Property="DockPanel.Dock" Value="Top"/>
      <Setter Property="FontSize" Value="12"/>
    </Style>
    <Style TargetType="{x:Type TextBox}">
      <Setter Property="Width" Value="100"/>
      <Setter Property="Height" Value="25"/>
      <Setter Property="DockPanel.Dock" Value="Top"/>
    </Style>
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="Width" Value="100"/>
      <Setter Property="Height" Value="25"/>
      <Setter Property="DockPanel.Dock" Value="Top"/>
    </Style>
  </Window.Resources>

  <Border Margin="25" BorderBrush="Aqua" BorderThickness="3" Padding="8">
    <DockPanel Width="200" Height="100">
      <Label>Enter a Name:</Label>
      <TextBox>
        <TextBox.Text>
          <Binding Source="{StaticResource myDataSource}" Path="Name"
                   UpdateSourceTrigger="PropertyChanged"/>
        </TextBox.Text>
      </TextBox>

      <Label>The name you entered:</Label>
      <TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
    </DockPanel>
  </Border>
</Window>

因此,当用户在 TextBox中输入文本时,TextBlock 显示相同的文本(因为源已更改),如下示例截图所示:

显示简单数据绑定的屏幕截图。

如果你有一个对话框或用户可编辑的窗体,并且你想要延迟源更新,直到用户完成编辑字段并单击“确定”,则可以将绑定的 UpdateSourceTrigger 值设置为 Explicit,如以下示例所示:

<TextBox Name="itemNameTextBox"
         Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />

UpdateSourceTrigger 值设置为 Explicit时,源值仅在应用程序调用 UpdateSource 方法时更改。 以下示例演示如何为 itemNameTextBox调用 UpdateSource

// itemNameTextBox is an instance of a TextBox
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
Me.itemNameTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
Me.bidPriceTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()

注意

可以对其他控件的属性使用相同的技术,但请记住,大多数其他属性具有默认 UpdateSourceTriggerPropertyChanged。 有关详细信息,请参阅 UpdateSourceTrigger 属性页。

注意

UpdateSourceTrigger 属性处理源更新,因此仅适用于 TwoWayOneWayToSource 绑定。 若要使 TwoWayOneWayToSource 绑定正常工作,源对象需要提供属性更改通知。 有关详细信息,请参阅本主题中引用的示例。 此外,还可以查看 实现属性更改通知

另请参阅