Reputation: 117
This question was asked here for thousands times. But really, none of your examples and answers works for me. So let me show you my code.
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 ignores this binding (nothing changes when I type in textbox, and nothing changes when I change playlist.DriveLetter property.
Debugger says, that PropertyChanged handler is not null
{Method = {Void OnPropertyChanged(System.Object, System.ComponentModel.PropertyChangedEventArgs)}}
So, any ideas what I am doing wrong. (I do not belive that WPF is wrong)?
Thanks in advance!
Upvotes: 4
Views: 12445
Reputation: 135
Change
textBox1.SetBinding(TextBlock.TextProperty, bind);
to
textBox1.SetBinding(TextBox.TextProperty, bind);
Upvotes: 6
Reputation: 131
you don't have to do it this way, even if you want to use your playlist later on. Just use a Property in your Window like:
public PlayList PlayList
{
get;
private set;
}
and Bind your TextBox like this:
<TextBox Text="{Binding Path=PlayList.DriveLetter}"/>
you also have to set the DataContext of the Window, I think:
DataContext = this;
or you set the Data Context to your PlayList:
DataContext = PlayList;
so the Binding looks like this:
<TextBox Text="{Binding Path=DriveLetter}"/>
Upvotes: 3
Reputation: 30097
change
textBox1.SetBinding(TextBlock.TextProperty, bind);
to
textBox1.SetBinding(TextBox.TextProperty, bind);
You are binding TextBlock's
text property rather than TexBox's
text property
Upvotes: 2