WPF ElementName双向绑定:为什么即时更新以一种方式工作而另一种方式不工作?

时间:2016-06-06 11:28:28

标签: wpf data-binding

我在WPF表单上有两个文本框。第二个TextBox使用ElementName绑定从第一个TextBox获取其文本,它还通过TwoWay绑定模式更新第一个文本框:

<StackPanel Orientation="Vertical">
    <TextBox Name="TextBox1"/>
    <TextBox Text="{Binding ElementName=TextBox1, Path=Text, Mode=TwoWay}"/>
</StackPanel>

当我编辑第二个文本框时,第一个文本框仅在第二个文本框失去焦点时更新,而不是在我键入时立即更新。 (这是预期的,UpdateSourceTrigger=PropertyChanged可以添加到绑定中以获得即时更新。)

但是,当我编辑第一个文本框时,第二个文本框会在我键入时立即更新。这不是我的预期。这是为什么?

2 个答案:

答案 0 :(得分:1)

嗯,这是预期的行为。

想象一下,您将Label或(TextBlock)绑定到数据类的属性,例如Person.Name:

<Label Content="{Binding Person.Name}" />
每当Person.Name发生变化时,

您希望标签更新

在这种情况下,Person是您的绑定源和Label 绑定目标

现在回到你的案子。你有两个文本框,其中第二个是数据绑定到第一个。第一个是绑定源,第二个是绑定目标。每当源更改时,目标都会更新,就像它被数据绑定到Person.Name一样。 UpdateSourceTrigger 参数仅在更新源时受影响,如参数名称所示。

替代方法: 将TextBoxes数据绑定到第3个对象(通常是ViewModel)。

<StackPanel Orientation="Vertical">
    <TextBox Text="{Binding SomeProperty}"/>
    <TextBox Text="{Binding SomeProperty}"/>
</StackPanel>

答案 1 :(得分:1)

任何TextBox的DependencyProperty Text在键入新符号时更新(可以通过将处理程序附加到TextChanged事件来测试)

但两个DP之间有一个连接器:绑定(来自 MSDN article的图像

Binding

绑定目标DP的拦截更改并根据UpdateSourceTrigger参数更新源属性。来自Source的更改会立即显示。

  

TwoWay或OneWayToSource的绑定侦听目标属性中的更改并将它们传播回源。这称为更新源。通常,只要目标属性更改,就会发生这些更新。这适用于复选框和其他简单控件,但它通常不适用于文本字段。每次击键后更新都会降低性能,并且在提交新值之前,它会拒绝用户退回并修复键入错误的通常机会。因此,Text属性的默认UpdateSourceTrigger值是LostFocus而不是PropertyChanged。

具有simmetric行为,对两个TextBox都使用绑定

<StackPanel Orientation="Vertical">
    <TextBox Name="TextBox1" Text="{Binding Path=Text, ElementName=Txt, Mode=TwoWay}"/>
    <TextBlock Name="Txt" Visibility="Collapsed"/>
    <TextBox Name="TextBox2" Text="{Binding Path=Text, ElementName=Txt, Mode=TwoWay}"/>
</StackPanel>