65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 绑定中的 UpdateSourceTrigger 属性

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (18投票s)

2012年12月12日

CPOL

3分钟阅读

viewsIcon

99801

downloadIcon

992

在 WPF 和 Silverlight 中更新绑定源。

引言

在本文中,我想向您展示在 WPF 和 Silverlight 中更新绑定源的概念。您可能知道,当我们使用 TwoWay 作为绑定的模式时,在绑定目标中发生的任何更改都会影响源的值。请注意,这仅发生在您使用 TwoWay 绑定时,而不是 OneWay(这是默认模式)或 OneTime

现在,问题是什么时候用目标中发生的更改来更新源。实际上,有三种方法

  • 默认:因控件而异。例如,对于 TextBox,这意味着当绑定目标发生 LostFocus 事件时。
  • PropertyChanged:这意味着当目标发生更改时,源会立即更新。例如,当您在作为绑定目标的 TextBox 中键入字符时,源也会更新。这意味着当您键入字符时,TextBoxText 属性会发生变化。
  • 显式:当 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。第二个 TextBoxText 属性绑定到第一个 TextBoxText 属性。实际上,这在我们的所有示例中都是相同的代码。绑定的 Mode 设置为 TwoWay,因为我们希望在目标发生更改时更新源。最后,绑定的 UpdateSourceTrigger 属性设置为 Default。这意味着当第二个 TextBox(即绑定目标)失去焦点(或触发 LostFocus 事件)时,第一个 TextBoxText 属性中的字符串(即绑定源)会更新。

我们的第二个例子处理将 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。顾名思义,这意味着每当第二个 TextBoxText 属性发生更改时,第一个 TextBoxText 属性会立即更新。

最后,我们的最后一个例子是关于将 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。之后,获取了 txtOutput3Text 属性的绑定表达式,并将其放入该实例中。最后,调用了 beUpdateSource 方法,该方法显式地更新了绑定的源。

© . All rights reserved.