在WPF中保持两个文本框同步

13

我有两个文本框,我想让它们保持同步,即两个文本框的内容应该完全相同。如果一个文本框更改了,另一个文本框的内容应该自动同步,反之亦然。我想使用WPF数据绑定功能来实现它。我有以下代码:

<Window x:Class="WPFLearning.DataBindingTwoWay"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataBindingTwoWay" Height="300" Width="300">
    <Grid>
        <StackPanel>
            <TextBox x:Name="firstTextBox" Background="Silver"></TextBox>
            <TextBox x:Name="secondTextBox" Background="Gold" ></TextBox>
        </StackPanel>
    </Grid>
</Window>

我尝试使用Binding Markup Extensions,但无法正确使用。这是我如何在第一个文本框中指定绑定的方法:

<TextBox x:Name="firstTextBox" Background="Silver" Text="{Binding Source=secondTextBox, Path=Text, Mode=TwoWay}"></TextBox>

此外,没有运行时错误。我做错了什么?

2个回答

13

如果这是你想要做的,WPF可以让你实现:

<Grid>
    <StackPanel>
        <TextBox x:Name="firstTextBox" Background="Silver" Text="{Binding Path=Text, ElementName=secondTextBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
        <TextBox x:Name="secondTextBox" Background="Gold" ></TextBox>
    </StackPanel>
</Grid>

ElementName 语法是绑定到 DataContext 的属性基本方法中非常强大的一种扩展。许多疯狂的事情变得可能。


正是我想要的。唯一的区别是,我使用了 Source=secondTextBox,而在你的代码中它是 ElementName=secondTextBox。您能否也解释一下这两者之间的区别?我已将您的回答标记为答案;它解决了我的问题。 - Anand Patel
@Anand Patel:请查看“ElementName”的文档。备注中对其进行了描述,并且有一个类似于您的示例。还有一个链接到绑定概述,非常值得一读。这是链接:http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx - Rick Sladkey
嗨@RickSladkey,有没有办法仅在用户按下回车键时同步第二个文本框? - Nerdynosaur

1
你确定要将一个文本框绑定到另一个文本框吗?这样做会导致更改另一个文本框中的文本值不会影响其他文本框(除非每个文本框都绑定到其他文本框,这听起来像是一件荒谬的事情)。
实现这个功能的正确方法是将两个文本框(或任何数量的文本框、控件等)绑定到一个属性上。该属性存在于数据模型和/或视图模型中。

1
将两个文本框绑定在一起与绑定一个文本框和数据模型(实现INotifyPropertyChanged)有何不同?我只是为了学习而这样做。没有Model和ViewModel类 :)。我非常清楚(如指定的那样)我想要实现什么。不清楚如何使用数据绑定来实现或是否可能通过数据绑定实现。 - Anand Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接