次の方法で共有


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

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

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

入力時にソースを更新する場合は、バインディングの UpdateSourceTriggerPropertyChangedに設定します。 次の例では、強調表示されたコード行は、TextTextBoxの両方の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にテキストを入力する場合と同じテキストを表示します (ソースが変更されるため)。

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

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

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

UpdateSourceTrigger値を Explicit に設定すると、アプリケーションが UpdateSource メソッドを呼び出すときにのみソース値が変更されます。 次の例は、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()

他のコントロールのプロパティにも同じ手法を使用できますが、他のほとんどのプロパティの既定の UpdateSourceTrigger 値は PropertyChanged であることに注意してください。 詳細については、「 UpdateSourceTrigger プロパティ」ページを参照してください。

UpdateSourceTrigger プロパティはソースの更新を処理するため、TwoWayまたはOneWayToSourceバインドにのみ関連します。 TwoWayバインドとOneWayToSourceバインドを機能させるには、ソース オブジェクトがプロパティ変更通知を提供する必要があります。 詳細については、このトピックで引用されているサンプルを参照してください。 さらに、「 プロパティ変更通知の実装」を参照してください。

こちらも参照ください