如何控制 TextBox 文本更新源的时机
本主题介绍如何使用 UpdateSourceTrigger 属性来控制绑定源更新的计时。 本主题使用 TextBox 控件作为示例。
例
TextBox.Text 属性的默认 UpdateSourceTrigger 值为 LostFocus。 这意味着,如果一个应用程序的 TextBox 具有数据绑定的 TextBox.Text 属性,那么在 TextBox 失去焦点之前,你在 TextBox 输入的文本不会更新数据源(例如,当你点击离开 TextBox时)。
如果要在键入时更新源,请将绑定 UpdateSourceTrigger 设置为 PropertyChanged。 在以下示例中,突出显示的代码行表明 TextBox 和 TextBlock 的 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>
因此,当用户在 TextBox中输入文本时,TextBlock 显示相同的文本(因为源已更改),如下示例截图所示:
如果你有一个对话框或用户可编辑的窗体,并且你想要延迟源更新,直到用户完成编辑字段并单击“确定”,则可以将绑定的 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()
注意
可以对其他控件的属性使用相同的技术,但请记住,大多数其他属性具有默认 UpdateSourceTrigger 值 PropertyChanged。 有关详细信息,请参阅 UpdateSourceTrigger 属性页。
注意
UpdateSourceTrigger 属性处理源更新,因此仅适用于 TwoWay 或 OneWayToSource 绑定。 若要使 TwoWay 和 OneWayToSource 绑定正常工作,源对象需要提供属性更改通知。 有关详细信息,请参阅本主题中引用的示例。 此外,还可以查看 实现属性更改通知。