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

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

示例:

TextBox.Text 属性的默认值 UpdateSourceTriggerLostFocus. 这意味着,如果应用程序中某个 TextBox 具有一个数据绑定的 TextBox.Text 属性,那么在 TextBox 中键入的文本将不会更新源,直到 TextBox 失去焦点(例如,当您点击其他地方离开 TextBox 时)。

如果要在键入时更新源,请将 UpdateSourceTrigger 绑定设置为 PropertyChanged. 在下面的示例中,突出显示的代码行展示了 TextBoxTextBlock 的属性都绑定在同一个源属性上。 绑定 UpdateSourceTrigger 的属性 TextBox 设置为 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 显示相同的文本(因为源更改),如以下示例屏幕截图所示。

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

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

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

将值Explicit设置为UpdateSourceTrigger时,源值仅在应用程序调用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 绑定生效,源对象需要提供属性更改通知。 有关详细信息,请参阅本主题中引用的示例。 此外,还可以查看 “实现属性更改通知”。

另请参阅