这次我的测试代码显示了一个TextBox和两个TextBlocks。 TextBox和第一个TextBlock通过双向数据绑定连接到数据上下文的字符串属性。第二个TextBlock由TextBox的TextChanged事件上的事件处理程序更新,该事件处理程序将其设置为字符串属性的当前值。
当窗口加载时,两个TextBlock都正确初始化。但是当我输入TextBox时,只有第二个更新。更新第二个TextBlock的事实确认TextBox与字符串属性的双向绑定正在起作用。但为什么第一个TextBlock没有更新?
标记:
<Window x:Class="DataBinding.SimpleDataBinding"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SimpleDataBinding" Height="300" Width="300" >
<StackPanel>
<TextBox Name="txtPerson" Text="{Binding Path=Person, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Name="tbPerson1" Text="{Binding Path=Person, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Name="tbPerson2" />
</StackPanel>
</Window>
代码背后:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace DataBinding
{
public partial class SimpleDataBinding : Window
{
public string Person { get; set; }
public SimpleDataBinding() {
InitializeComponent();
Person = "George";
DataContext = this;
txtPerson.TextChanged += new TextChangedEventHandler(txtPerson_TextChanged);
}
private void txtPerson_TextChanged(object sender, TextChangedEventArgs e) {
tbPerson2.Text = Person;
}
}
}
答案 0 :(得分:1)
您的第二个文本框未通过数据绑定进行更新 - 它正在更新,因为您正在事件处理程序中直接更改其值。
您的代码需要实现INotifyPropertyChanged接口。这个接口和实现是数据绑定的关键,如果你正在学习WPF / Silverlight并想要使用数据绑定,你需要学习所有关于这个接口以及如何实现它。
这是一个基本实现(来自上面的链接):
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
以下是您希望如何将它用于您的示例(未经测试但未输入IDE,因此可能有错误):
private string _person;
public string Person
{
get {return _person;}
set
{
if (value == _person) return;
_person = value;
NotifyPropertyChanged("Person");
}
}
然后你可以摆脱这一行:
txtPerson.TextChanged += new TextChangedEventHandler(txtPerson_TextChanged);
并将绑定添加到第二个文本块:
<TextBlock Name="tbPerson2" Text="{Binding Path=Person, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
您也可以从文本框和文本块中删除名称,因为在使用数据绑定时几乎不需要名称。