Udostępnij za pośrednictwem


Instrukcje: kontrolowanie, kiedy tekst TextBox aktualizuje źródło

W tym temacie opisano sposób używania właściwości UpdateSourceTrigger w celu kontrolowania momentu aktualizacji źródła powiązania. W tym temacie użyto kontrolki TextBox jako przykładu.

Przykład

Właściwość TextBox.Text ma domyślną wartość UpdateSourceTriggerLostFocus. Oznacza to, że jeśli aplikacja ma TextBox z właściwością TextBox.Text powiązaną z danymi, tekst, który wpisujesz w TextBox, nie aktualizuje źródła, dopóki TextBox nie utraci fokusu (na przykład po kliknięciu poza TextBox).

Jeśli chcesz zaktualizować źródło podczas wpisywania, ustaw UpdateSourceTrigger powiązania na wartość PropertyChanged. W poniższym przykładzie wyróżnione wiersze kodu pokazują, że właściwości Text zarówno TextBox, jak i TextBlock są powiązane z tą samą właściwością źródłową. Właściwość UpdateSourceTrigger powiązania TextBox jest ustawiona na wartość 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>

W związku z tym TextBlock pokazuje ten sam tekst (ponieważ źródło się zmienia), ponieważ użytkownik wprowadza tekst do TextBox, jak pokazano na poniższym zrzucie ekranu przykładu:

Zrzut ekranu przedstawiający proste powiązanie danych.

Jeśli masz okno dialogowe lub formularz z możliwością edycji użytkownika i chcesz odroczyć aktualizacje źródłowe, dopóki użytkownik nie zakończy edycji pól i kliknie przycisk OK, możesz ustawić wartość UpdateSourceTrigger powiązań na Explicit, jak w poniższym przykładzie:

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

Po ustawieniu wartości UpdateSourceTrigger na wartość Explicitwartość źródłowa zmienia się tylko wtedy, gdy aplikacja wywołuje metodę UpdateSource. W poniższym przykładzie pokazano, jak wywołać UpdateSource dla 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()

Uwaga / Notatka

Można użyć tej samej techniki dla właściwości innych kontrolek, ale należy pamiętać, że większość innych właściwości ma domyślną wartość UpdateSourceTriggerPropertyChanged. Aby uzyskać więcej informacji, zobacz stronę właściwości UpdateSourceTrigger.

Uwaga / Notatka

Właściwość UpdateSourceTrigger dotyczy aktualizacji źródłowych i dlatego ma zastosowanie tylko w przypadku powiązań TwoWay lub OneWayToSource. Aby powiązania TwoWay i OneWayToSource działały, obiekt źródłowy musi dostarczyć powiadomienia o zmianie właściwości. Aby uzyskać więcej informacji, zapoznaj się z przykładami cytowanymi w tym temacie. Ponadto można zapoznać się z Implementowanie powiadomienia o zmianie właściwości.

Zobacz także