方法: TextBox テキストでソースを更新するタイミングを制御する

このトピックでは、UpdateSourceTrigger プロパティを使用して、バインディング ソースの更新のタイミングを制御する方法について説明します。 このトピックでは、例として TextBox コントロールを使用します。

TextBox.Text プロパティの UpdateSourceTrigger の既定値は LostFocus です。 つまり、アプリケーションにデータ バインドされた TextBox.Text プロパティを持つ TextBox がある場合、TextBox がフォーカスを失うまで (たとえば、TextBox からクリックして移動したとき)、TextBox に入力したテキストでソースは更新されません。

入力したらソースが更新されるようにしたい場合は、バインディングの UpdateSourceTriggerPropertyChanged に設定します。 次の例の強調表示されているコード行は、TextBoxTextBlock 両方の Text プロパティが、同じソース プロパティにバインドされていることを示します。 TextBox バインディングの UpdateSourceTrigger プロパティは、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.

ダイアログまたはユーザーが編集できるフォームがあり、ユーザーがフィールドの編集を終えて [OK] をクリックするまでソースの更新を遅延させる場合は、次の例のように、バインディングの UpdateSourceTrigger の値を Explicit に設定します。

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

UpdateSourceTrigger の値を Explicit に設定すると、ソースの値は、アプリケーションで UpdateSource メソッドが呼び出された場合にのみ変更されます。 次の例では、itemNameTextBox に対して UpdateSource を呼び出す方法を示します。

// 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 であることに注意してください。 詳細については、UpdateSourceTrigger プロパティのページを参照してください。

注意

UpdateSourceTrigger プロパティではソースの更新が処理されるため、このプロパティは TwoWay または OneWayToSource のバインディングにのみ関連します。 TwoWay および OneWayToSource のバインディングを機能させるには、ソース オブジェクトでプロパティ変更通知を提供する必要があります。 詳しくは、このトピック内にあるサンプルをご覧ください。 また、「方法 : プロパティの変更通知を実装する」もご覧ください。

関連項目