mszubart
mszubart

Reputation: 117

Two way binding for TextBox

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

Answers (3)

Rayden
Rayden

Reputation: 135

Change

textBox1.SetBinding(TextBlock.TextProperty, bind); 

to

textBox1.SetBinding(TextBox.TextProperty, bind); 

Upvotes: 6

bolia
bolia

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

Haris Hasan
Haris Hasan

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

Related Questions