WPF 绑定中的 UpdateSourceTrigger 属性






4.76/5 (18投票s)
在 WPF 和 Silverlight 中更新绑定源。
引言
在本文中,我想向您展示在 WPF 和 Silverlight 中更新绑定源的概念。您可能知道,当我们使用 TwoWay
作为绑定的模式时,在绑定目标中发生的任何更改都会影响源的值。请注意,这仅发生在您使用 TwoWay
绑定时,而不是 OneWay
(这是默认模式)或 OneTime
。
现在,问题是什么时候用目标中发生的更改来更新源。实际上,有三种方法
- 默认:因控件而异。例如,对于
TextBox
,这意味着当绑定目标发生LostFocus
事件时。 PropertyChanged
:这意味着当目标发生更改时,源会立即更新。例如,当您在作为绑定目标的TextBox
中键入字符时,源也会更新。这意味着当您键入字符时,TextBox
的Text
属性会发生变化。- 显式:当
UpdateSourceTrigger
设置为Explicit
时,源不会更新,除非您在代码隐藏中显式地执行此操作。
对于所有这些方法,我编写了一些代码来帮助您更好地理解它们。我们从默认方法开始。查看以下代码片段
<Border BorderThickness="2" Margin="0 20 0 0" BorderBrush="Brown" CornerRadius="5">
<StackPanel>
<TextBox x:Name="textInput2" Margin="5" />
<TextBox x:Name="txtOutput2" Margin="5"
Text="{Binding Text,
ElementName=textInput2,
UpdateSourceTrigger=Default,
Mode=TwoWay}"/>
</StackPanel>
</Border>
这里有一个 Border
元素,其中包含一个 StackPanel
,其中包含两个 TextBox
。第二个 TextBox
的 Text
属性绑定到第一个 TextBox
的 Text
属性。实际上,这在我们的所有示例中都是相同的代码。绑定的 Mode
设置为 TwoWay
,因为我们希望在目标发生更改时更新源。最后,绑定的 UpdateSourceTrigger
属性设置为 Default
。这意味着当第二个 TextBox
(即绑定目标)失去焦点(或触发 LostFocus
事件)时,第一个 TextBox
的 Text
属性中的字符串(即绑定源)会更新。
我们的第二个例子处理将 UpdateSourceTrigger
设置为 PropertyChanged
。
<Border BorderThickness="2" BorderBrush="Brown" CornerRadius="5">
<StackPanel>
<TextBox x:Name="textInput1" Margin="5" />
<TextBox x:Name="txtOutput1" Margin="5"
Text="{Binding Text,
ElementName=textInput1,
UpdateSourceTrigger=PropertyChanged,
Mode=TwoWay}"/>
</StackPanel>
</Border>
与第一个代码片段相比,唯一不同的是 UpdateSourceTrigger
设置为 PropertyChanged
。顾名思义,这意味着每当第二个 TextBox
的 Text
属性发生更改时,第一个 TextBox
的 Text
属性会立即更新。
最后,我们的最后一个例子是关于将 UpdateSourceTrigger
属性设置为 Explicit
。
<Border BorderThickness="2" Margin="0 20 0 0" BorderBrush="Brown" CornerRadius="5">
<StackPanel>
<TextBox x:Name="textInput3" Margin="5" />
<TextBox x:Name="txtOutput3" Margin="5"
Text="{Binding Text,
ElementName=textInput3,
UpdateSourceTrigger=Explicit,
Mode=TwoWay}"/>
<Button Content="Save" Click="Button_Click"/>
</StackPanel>
</Border>
此代码片段中不同的地方在于 UpdateSourceTrigger
设置为 Explicit
。正如我们之前所说,这意味着更新过程不会发生,除非您显式地执行它。在第二个 TextBox
之后声明的 Button
负责执行此操作。您可能已经注意到,它的 Click
事件有一个 EventHandler,并且以下代码行是在该 EventHandler 中编写的。
private void Button_Click(object sender, RoutedEventArgs e)
{
BindingExpression be = txtOutput3.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
}
声明了 BindingExpression
类的实例,名为 be
。之后,获取了 txtOutput3
的 Text
属性的绑定表达式,并将其放入该实例中。最后,调用了 be
的 UpdateSource
方法,该方法显式地更新了绑定的源。