Cómo: Controlar cuándo el texto de TextBox actualiza el origen

En este tema se describe cómo utilizar la propiedad UpdateSourceTrigger para controlar el tiempo de las actualizaciones del origen de enlace. En el tema se utiliza el control TextBox como ejemplo.

Ejemplo

La propiedad TextBox.Text tiene un valor predeterminado de UpdateSourceTrigger de LostFocus. Esto significa que si una aplicación tiene un TextBox con una propiedad TextBox.Text enlazada a datos, el texto que se escriba en TextBox no actualizará el origen de enlace hasta que TextBox pierda el foco (por ejemplo, cuando haga clic fuera de TextBox).

Si desea que el origen se actualice a medida que se escribe, debe establecer la propiedad UpdateSourceTrigger del enlace en PropertyChanged. En el ejemplo siguiente, las líneas de código resaltadas muestran que las propiedades Text de TextBox y TextBlock están enlazadas a la misma propiedad de origen. La propiedad UpdateSourceTrigger del enlace TextBox se establece en 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>

Como resultado, TextBlock muestra el mismo texto (dado que el origen cambia) a medida que el usuario escribe texto en TextBox, como se muestra en la captura de pantalla siguiente del ejemplo:

Screenshot that shows simple data binding.

Si tiene un cuadro de diálogo o un formulario modificable por el usuario y desea diferir las actualizaciones del origen hasta que el usuario haya terminado de modificar los campos y haga clic en "Aceptar", puede establecer el valor de UpdateSourceTrigger de los enlaces en Explicit, como en el ejemplo siguiente:

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

Si se establece el valor de UpdateSourceTrigger en Explicit, el valor de origen cambia únicamente cuando la aplicación llama al método UpdateSource. En el ejemplo siguiente se muestra cómo llamar a UpdateSource para itemNameTextBox:

// 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()

Nota

Puede utilizar la misma técnica para las propiedades de otros controles, pero debe tener presente que el valor predeterminado de UpdateSourceTrigger de la mayoría de las demás propiedades es PropertyChanged. Para obtener más información, vea la página de la propiedad UpdateSourceTrigger.

Nota

La propiedad UpdateSourceTrigger se encarga de las actualizaciones del origen y, por tanto, únicamente resulta pertinente para los enlaces TwoWay o OneWayToSource. Para que los enlaces TwoWay y OneWayToSource funcionen, el objeto de origen debe proporcionar notificaciones de cambio de propiedad. Puede consultar los ejemplos citados en este tema para obtener más información. Además, puede consultar Implementar la notificación de cambio de propiedad.

Vea también