Two way binding for TextBox

11,728

Solution 1

Change

textBox1.SetBinding(TextBlock.TextProperty, bind); 

to

textBox1.SetBinding(TextBox.TextProperty, bind); 

Solution 2

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}"/>

Solution 3

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

Share:
11,728
mszubart
Author by

mszubart

Updated on June 04, 2022

Comments

  • mszubart
    mszubart almost 2 years

    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!

  • mszubart
    mszubart over 12 years
    I am really sorry. Really sorry for my blindness (too fast typing + InteliSense). I'm going to Castorama to buy some rope. 2 Days wasted.