我在WPF表单上有两个文本框。第二个TextBox使用ElementName绑定从第一个TextBox获取其文本,它还通过TwoWay绑定模式更新第一个文本框:
<StackPanel Orientation="Vertical">
<TextBox Name="TextBox1"/>
<TextBox Text="{Binding ElementName=TextBox1, Path=Text, Mode=TwoWay}"/>
</StackPanel>
当我编辑第二个文本框时,第一个文本框仅在第二个文本框失去焦点时更新,而不是在我键入时立即更新。 (这是预期的,UpdateSourceTrigger=PropertyChanged
可以添加到绑定中以获得即时更新。)
但是,当我编辑第一个文本框时,第二个文本框会在我键入时立即更新。这不是我的预期。这是为什么?
答案 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的图像)
绑定目标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>