Двухстороннее связывание для TextBox - PullRequest
4 голосов
/ 07 декабря 2011

Этот вопрос задавался здесь тысячи раз.Но на самом деле, ни один из ваших примеров и ответов не работает для меня.Итак, позвольте мне показать вам мой код.

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 не прав)?

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Изменить

textBox1.SetBinding(TextBlock.TextProperty, bind); 

на

textBox1.SetBinding(TextBox.TextProperty, bind); 
3 голосов
/ 07 декабря 2011

вам не нужно делать это таким образом, даже если вы хотите использовать свой плейлист позже. Просто используйте свойство в вашем окне, как:

public PlayList PlayList
{
  get;
  private set;
}

и свяжите свой TextBox следующим образом:

<TextBox Text="{Binding Path=PlayList.DriveLetter}"/>

Вы также должны установить DataContext окна, я думаю:

DataContext = this;

или вы установили контекст данных в свой список воспроизведения:

DataContext = PlayList;

так что Привязка выглядит так:

<TextBox Text="{Binding Path=DriveLetter}"/>
2 голосов
/ 07 декабря 2011

изменение

 textBox1.SetBinding(TextBlock.TextProperty, bind);

до

 textBox1.SetBinding(TextBox.TextProperty, bind);

Вы связываете TextBlock's текстовое свойство, а не TexBox's текстовое свойство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...