如何对两个UI元素进行数据绑定,以便它们可以在Silverlight中立即相互更新?

时间:2009-08-30 01:22:17

标签: silverlight data-binding

假设我想数据绑定两个TextBox。我可以在XAML中完成:

<TextBox x:Name="FirstBox" Text="{Binding Text, Mode=TwoWay, ElementName= SecondBox}"></TextBox>
<TextBox x:Name="SecondBox"></TextBox>

或者,我可以通过编程方式完成。

    Binding binding = new Binding("Text");
    binding.Mode = BindingMode.TwoWay;
    binding.Source = SecondBox;
    FirstBox.SetBinding(TextBox.TextProperty, binding);

问题是,当我在SecondBox中输入内容时,它会立即反映在FirstBox中。但是,在FirstBox中输入不会立即显示在SecondBox中。只有在关注FirstBox时才更新SecondBox。

当然,我可以为SecondBox构建另一个Binding。但是,有没有其他方法可以在FirstBox中立即更新SecondBox?

3 个答案:

答案 0 :(得分:3)

可能还有其他方法包含代码块,但如果这是你真正要求的话,我就不会想到更容易的方法。你为什么不在SecondBox上使用另一个绑定来观察第一个(我假设这是一个场景的简化,其中任何一个实际上都有意义)?

答案 1 :(得分:2)

您可以通过一些代码实现此目的。 Xaml看起来像这样:

<TextBox x:Name="tb1" Text="{Binding Path=Text, ElementName=tb2, Mode=TwoWay, UpdateSourceTrigger=Explicit}" TextChanged="tb1_TextChanged" />
<TextBox x:Name="tb2" />

除了我们设置“UpdateSourceTrigger = Explicit”并且我们正在注册TextChanged事件之外,这与您拥有的相同。默认情况下,当TextBox失去焦点时,TextBox.Text上的绑定会更新。通过设置“UpdateSourceTrigger = Explicit”,我们将覆盖默认的更新行为,我们需要明确说明何时更新绑定。所以我们有TextChanged事件处理程序,如下所示:

private void tb1_TextChanged(object sender, TextChangedEventArgs e)
{
    tb1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}

答案 2 :(得分:1)

我认为这是TextBox的预期行为。来自http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspx

更新数据源 在TwoWay绑定中,对目标的更改会自动更新源,除非绑定到TextBox的Text属性。在这种情况下,当TextBox失去焦点时发生更新

我认为您还需要绑定第二个TextBox上的Text属性,以获得您想要的行为,如Anthony建议的那样。