【发布时间】:2012-01-14 23:22:41
【问题描述】:
这个问题在这里被问了数千次。 但实际上,你的例子和答案都不适合我。 所以让我给你看我的代码。
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";
}
}
当然 WPF 会忽略此绑定(当我在文本框中键入时没有任何变化,当我更改 playlist.DriveLetter 属性时也没有任何变化。
调试器说,PropertyChanged 处理程序不为空
{Method = {Void OnPropertyChanged(System.Object, System.ComponentModel.PropertyChangedEventArgs)}}
所以,任何想法我做错了什么。 (我不相信WPF是错的)?
提前致谢!
【问题讨论】:
-
您是否有任何理由使用代码而不是 XAML 构建绑定?您是否尝试过使用 Snoop 之类的工具来调试绑定,或者您是否尝试过在属性中设置断点以查看那里是否正在执行任何代码?
-
是的,这是有充分理由的。我想稍后在代码中使用播放列表对象。
-
我不会说这是这样做的好理由。
-
您可以在代码中声明您的
Playlist对象,同时将其设置为TextBox的DataContext,或者简单地为其提供一个属性,XAML 可以引用它的来源。