TextBox的双向绑定

时间:2011-12-07 12:43:36

标签: c# wpf binding textbox

这个问题在这里被问了好几千次。 但实际上,你的例子和答案都不适合我。 那么让我告诉你我的代码。

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忽略了这个绑定(当我输入文本框时没有任何变化,当我更改playlist.DriveLetter属性时没有任何变化。

调试器说,PropertyChanged处理程序不为null

{Method = {Void OnPropertyChanged(System.Object, System.ComponentModel.PropertyChangedEventArgs)}}

所以,任何想法我做错了什么。 (我不相信WPF错了)?

提前致谢!

3 个答案:

答案 0 :(得分:6)

更改

textBox1.SetBinding(TextBlock.TextProperty, bind); 

textBox1.SetBinding(TextBox.TextProperty, bind); 

答案 1 :(得分:3)

即使您想稍后使用播放列表,也不必这样做。 只需在窗口中使用一个属性,如:

public PlayList PlayList
{
  get;
  private set;
}

并将你的TextBox绑定如下:

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

你还必须设置Window的DataContext,我想:

DataContext = this;

或者将数据上下文设置为PlayList:

DataContext = PlayList;

所以Binding看起来像这样:

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

答案 2 :(得分:2)

变化

 textBox1.SetBinding(TextBlock.TextProperty, bind);

 textBox1.SetBinding(TextBox.TextProperty, bind);

您正在绑定TextBlock's文本属性而不是TexBox's文本属性