方法: TextBox テキストでソースを更新するタイミングを制御するHow to: Control When the TextBox Text Updates the Source

このトピックでは、UpdateSourceTrigger プロパティを使用して、バインディング ソースの更新のタイミングを制御する方法について説明します。This topic describes how to use the UpdateSourceTrigger property to control the timing of binding source updates. このトピックでは、例として TextBox コントロールを使用します。The topic uses the TextBox control as an example.

Example

TextBox.Text プロパティの UpdateSourceTrigger の既定値は LostFocus です。The TextBox.Text property has a default UpdateSourceTrigger value of LostFocus. つまり、アプリケーションにデータ バインドされた TextBox.Text プロパティを持つ TextBox がある場合、TextBox がフォーカスを失うまで (たとえば、TextBox からクリックして移動したとき)、TextBox に入力したテキストでソースは更新されません。This means if an application has a TextBox with a data-bound TextBox.Text property, the text you type into the TextBox does not update the source until the TextBox loses focus (for instance, when you click away from the TextBox).

入力したらソースが更新されるようにしたい場合は、バインディングの UpdateSourceTriggerPropertyChanged に設定します。If you want the source to be updated as you type, set the UpdateSourceTrigger of the binding to PropertyChanged. 次の例の強調表示されているコード行は、TextBoxTextBlock 両方の Text プロパティが、同じソース プロパティにバインドされていることを示します。In the following example, the highlighted lines of code show that the Text properties of both the TextBox and the TextBlock are bound to the same source property. TextBox バインディングの UpdateSourceTrigger プロパティは、PropertyChanged に設定されています。The UpdateSourceTrigger property of the TextBox binding is set to 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 に入力したのと同じテキストが表示されます (ソースが変更されるため)。As a result, the TextBlock shows the same text (because the source changes) as the user enters text into the TextBox, as illustrated by the following screenshot of the sample:

簡単なデータ バインディングを示すスクリーンショット。

ダイアログまたはユーザーが編集できるフォームがあり、ユーザーがフィールドの編集を終えて [OK] をクリックするまでソースの更新を遅延させる場合は、次の例のように、バインディングの UpdateSourceTrigger の値を Explicit に設定します。If you have a dialog or a user-editable form and you want to defer source updates until the user is finished editing the fields and clicks "OK", you can set the UpdateSourceTrigger value of your bindings to Explicit, as in the following example:

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

UpdateSourceTrigger の値を Explicit に設定すると、ソースの値は、アプリケーションで UpdateSource メソッドが呼び出された場合にのみ変更されます。When you set the UpdateSourceTrigger value to Explicit, the source value only changes when the application calls the UpdateSource method. 次の例では、itemNameTextBox に対して UpdateSource を呼び出す方法を示します。The following example shows how to call UpdateSource for 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()

注意

他のコントロールのプロパティにも同じ手法を使用できますが、他のほとんどのプロパティでは PropertyChanged の既定値が UpdateSourceTrigger であることに注意してください。You can use the same technique for properties of other controls, but keep in mind that most other properties have a default UpdateSourceTrigger value of PropertyChanged. 詳細については、UpdateSourceTrigger プロパティのページを参照してください。For more information, see the UpdateSourceTrigger property page.

注意

UpdateSourceTrigger プロパティではソースの更新が処理されるため、このプロパティは TwoWay または OneWayToSource のバインディングにのみ関連します。The UpdateSourceTrigger property deals with source updates and therefore is only relevant for TwoWay or OneWayToSource bindings. TwoWay および OneWayToSource のバインディングを機能させるには、ソース オブジェクトでプロパティ変更通知を提供する必要があります。For TwoWay and OneWayToSource bindings to work, the source object needs to provide property change notifications. 詳しくは、このトピック内にあるサンプルをご覧ください。You can refer to the samples cited in this topic for more information. また、「方法 : プロパティの変更通知を実装する」もご覧ください。In addition, you can look at Implement Property Change Notification.

関連項目See also