Como controlar quando o texto de TextBox atualiza a origem

Este tópico descreve como usar a UpdateSourceTrigger propriedade para controlar o tempo das atualizações de origem vinculadas. O tópico usa o TextBox controle como exemplo.

Exemplo

A TextBox.Text propriedade tem um valor padrão UpdateSourceTrigger de LostFocus. Isso significa que, se um aplicativo tiver uma propriedade com uma TextBox propriedade associada a dados, o texto digitado no TextBox não atualizará a TextBox.Text origem até que o perda o TextBox foco (por exemplo, quando você clica TextBoxfora do ).

Se você quiser que a fonte seja atualizada à medida que você digita, defina o UpdateSourceTrigger da associação como PropertyChanged. No exemplo a seguir, as linhas de código realçadas mostram que as Text propriedades de e TextBox de e estão vinculadas à mesma propriedade de TextBlock origem. A UpdateSourceTrigger propriedade da TextBox associação é definida como 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, o mostra o mesmo texto (porque a fonte muda) à medida que o TextBlock usuário insere texto no TextBox, conforme ilustrado pela seguinte captura de tela do exemplo:

Screenshot that shows simple data binding.

Se você tiver uma caixa de diálogo ou um formulário editável pelo usuário e quiser adiar as atualizações de origem até que o usuário termine de editar os campos e clique em "OK", poderá definir o UpdateSourceTrigger valor de suas ligações como , como Explicitno exemplo a seguir:

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

Quando você define o valor como Explicit, o valor de origem só é alterado quando o aplicativo chama o UpdateSourceTriggerUpdateSource método. O exemplo a seguir mostra como chamar UpdateSourceitemNameTextBox:

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

Observação

Você pode usar a mesma técnica para propriedades de outros controles, mas lembre-se de que a maioria das outras propriedades tem um valor padrão UpdateSourceTrigger de PropertyChanged. Para obter mais informações, consulte a página de UpdateSourceTrigger propriedades.

Observação

A UpdateSourceTrigger propriedade lida com atualizações de origem e, portanto, só é relevante para TwoWay ou OneWayToSource vinculações. Para TwoWay que as ligações funcionem OneWayToSource , o objeto de origem precisa fornecer notificações de alteração de propriedade. Você pode consultar os exemplos citados neste tópico para obter mais informações. Além disso, você pode examinar Implementar notificação de alteração de propriedade.

Confira também