这个问题在这里被问了好几千次。 但实际上,你的例子和答案都不适合我。 那么让我告诉你我的代码。
public class PlayList : INotifyPropertyChanged{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name) {
var handler = PropertyChanged;
if (handler != null) {
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
private string _dl;
public string DriveLetter {
get { return _dl; }
set {
if (value != _dl) {
_dl = value;
OnPropertyChanged("DriveLetter");
}
}
}
}
public partial class MainWindow : Window {
public PlayList playlist = new PlayList();
private void Window_Loaded(object sender, RoutedEventArgs e) {
Binding bind = new Binding("DriveLetter");
bind.Source = this.playlist;
bind.Mode = BindingMode.TwoWay;
bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
textBox1.SetBinding(TextBlock.TextProperty, bind);
this.playlist.DriveLetter = "A";
}
}
Ofcourse WPF忽略了这个绑定(当我输入文本框时没有任何变化,当我更改playlist.DriveLetter属性时没有任何变化。
调试器说,PropertyChanged处理程序不为null
{Method = {Void OnPropertyChanged(System.Object, System.ComponentModel.PropertyChangedEventArgs)}}
所以,任何想法我做错了什么。 (我不相信WPF错了)?
提前致谢!
答案 0 :(得分:6)
更改
textBox1.SetBinding(TextBlock.TextProperty, bind);
到
textBox1.SetBinding(TextBox.TextProperty, bind);
答案 1 :(得分:3)
即使您想稍后使用播放列表,也不必这样做。 只需在窗口中使用一个属性,如:
public PlayList PlayList
{
get;
private set;
}
并将你的TextBox绑定如下:
<TextBox Text="{Binding Path=PlayList.DriveLetter}"/>
你还必须设置Window的DataContext,我想:
DataContext = this;
或者将数据上下文设置为PlayList:
DataContext = PlayList;
所以Binding看起来像这样:
<TextBox Text="{Binding Path=DriveLetter}"/>
答案 2 :(得分:2)
变化
textBox1.SetBinding(TextBlock.TextProperty, bind);
到
textBox1.SetBinding(TextBox.TextProperty, bind);
您正在绑定TextBlock's
文本属性而不是TexBox's
文本属性