简体   繁体   中英

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!

Change

textBox1.SetBinding(TextBlock.TextProperty, bind); 

to

textBox1.SetBinding(TextBox.TextProperty, bind); 

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM