Практическое руководство. Управление обновлением источника из поля TextBox

В этом разделе описано, как использовать свойство UpdateSourceTrigger для управления временем обновления источника привязки. В разделе в качестве примера используется элемент управления TextBox.

Пример

Свойство TextBox.Text по умолчанию UpdateSourceTrigger имеет значение, равное LostFocus. Это означает, что, если приложение имеет TextBox со свойством TextBox.Text, привязанным к данным, текст, который вы вводите в TextBox, не обновляет источник до тех пора, пока TextBox не потеряет фокус (например, когда вы щелкаете по другому объекту и снимаете выделение с TextBox).

Если вы хотите, чтобы источник обновлялся сразу в момент введения текста, задайте для UpdateSourceTrigger привязки значение PropertyChanged. В следующем примере выделенные строки кода показывают, что свойства Text как TextBox, так и TextBlock привязаны к одному и тому же свойству источника. Свойство 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>

В результате TextBlock отображает тот же текст (поскольку источник изменяется), который пользователь вводит в TextBox, как показано на следующем снимке экрана примера:

Screenshot that shows simple data binding.

Если имеется диалоговое окно или редактируемая пользователем форма, и требуется отложить обновление источника, пока пользователь не завершит редактирование поля и не нажмет кнопку "ОK", можно задать значение UpdateSourceTrigger привязок как Explicit, как показано в следующем примере:

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

Когда вы задаете значение UpdateSourceTrigger для Explicit, значение источника изменяется, только когда приложение вызывает метод UpdateSource. В следующем примере показано, как вызвать метод UpdateSource для 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()

Примечание.

Вы можете использовать эти же приемы для свойств других элементов управления, но помните, что большинство других свойств имеет значение по умолчанию UpdateSourceTrigger, равное PropertyChanged. Дополнительные сведения см. в описании свойства UpdateSourceTrigger.

Примечание.

Свойство UpdateSourceTrigger касается обновлений источника и, таким образом, релевантно только для привязок TwoWay или OneWayToSource. Чтобы привязки TwoWay и OneWayToSource работали, объект источника должен предоставлять уведомления об изменении свойств. Можно изучить примеры, приведенные в этом разделе, для получения дополнительной информации. Кроме того, см. раздел Реализация уведомления об изменении свойства.

См. также