【问题标题】:Two way binding for TextBoxTextBox的两种方式绑定
【发布时间】:2012-01-14 23:22:41
【问题描述】:

这个问题在这里被问了数千次。 但实际上,你的例子和答案都不适合我。 所以让我给你看我的代码。

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是错的)?

提前致谢!

【问题讨论】:

  • 您是否有任何理由使用代码而不是 XAML 构建绑定?您是否尝试过使用 Snoop 之类的工具来调试绑定,或者您是否尝试过在属性中设置断点以查看那里是否正在执行任何代码?
  • 是的,这是有充分理由的。我想稍后在代码中使用播放列表对象。
  • 我不会说这是这样做的好理由。
  • 您可以在代码中声明您的Playlist 对象,同时将其设置为TextBoxDataContext,或者简单地为其提供一个属性,XAML 可以引用它的来源。

标签: c# wpf binding textbox


【解决方案1】:

改变

textBox1.SetBinding(TextBlock.TextProperty, bind); 

textBox1.SetBinding(TextBox.TextProperty, bind); 

【讨论】:

    【解决方案2】:

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

    public PlayList PlayList
    {
      get;
      private set;
    }
    

    然后像这样绑定你的文本框:

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

    你还得设置Window的DataContext,我觉得:

    DataContext = this;
    

    或者您将数据上下文设置为您的播放列表:

    DataContext = PlayList;
    

    所以绑定看起来像这样:

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

    【讨论】:

      【解决方案3】:

      改变

       textBox1.SetBinding(TextBlock.TextProperty, bind);
      

       textBox1.SetBinding(TextBox.TextProperty, bind);
      

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

      【讨论】:

      • 真的很抱歉。真的很抱歉我的失明(打字太快+ InteliSense)。我要去Castorama买一些绳子。浪费了 2 天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 2017-09-05
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2018-12-09
      相关资源
      最近更新 更多