这是我从字符串(History.current_commad)到文本框(tbCommand)的数据绑定:
history = new History();
Binding bind = new Binding("Command");
bind.Source = history;
bind.Mode = BindingMode.TwoWay;
bind.Path = new PropertyPath("current_command");
bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
// myDatetext is a TextBlock object that is the binding target object
tbCommand.SetBinding(TextBox.TextProperty, bind);
history.current_command = "test";
history.current_command正在更改但文本框未更新。有什么问题?
由于
答案 0 :(得分:1)
您没有看到TextBlock
中反映的更改的原因是因为current_command
只是一个字段,因此Binding
不知道它何时被更新。
解决此问题的最简单方法是让您的History
类实现INotifyPropertyChanged
,将current_command
转换为属性,然后在setter中设置PropertyChanged
事件你的财产:
public class History : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
private string _current_command;
public string current_command
{
get
{
return _current_command;
}
set
{
if (_current_command == null || !_current_command.Equals(value))
{
// Change the value and notify that the property has changed
_current_command = value;
NotifyPropertyChanged("current_command");
}
}
}
}
现在,当您为current_command
分配值时,该事件将会触发,Binding
也会知道更新其目标。
如果您发现自己有很多类要绑定到它们的属性,那么您应该考虑将事件和帮助器方法移动到基类中,这样就不会重复编写相同的代码。