WPF:简单的TextBox数据绑定

时间:2009-11-12 21:30:11

标签: wpf data-binding textbox

我有这堂课:

public partial class Window1 : Window
{
    public String Name2;

    public Window1()
    {
        InitializeComponent();
        Name2 = new String('a', 5);
        myGrid.DataContext = this;
    }

    // ...
}

我想在文本框中显示字符串Name2

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2}"/>
</Grid>

但不显示字符串。此外,如果使用Name2定期更新字符串TimerCallback,我是否需要执行任何操作以确保在数据更改时更新文本框?

3 个答案:

答案 0 :(得分:73)

Name2是一个字段。 WPF仅绑定到属性。将其更改为:

public string Name2 { get; set; }

请注意,使用此最小实现,TextBox不会响应对Name2的编程更改。因此,对于计时器更新方案,您需要实现INotifyPropertyChanged:

partial class Window1 : Window, INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  protected void OnPropertyChanged(string propertyName)
  {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }

  private string _name2;

  public string Name2
  {
    get { return _name2; }
    set
    {
      if (value != _name2)
      {
         _name2 = value;
         OnPropertyChanged("Name2");
      }
    }
  }
}

您应该考虑将其移动到单独的数据对象而不是Window类。

答案 1 :(得分:7)

您的窗口未实现网格将其用作数据源所需的必要数据绑定通知,即INotifyPropertyChanged接口。

您的“Name2”字符串也需要是属性而不是公共变量,因为数据绑定用于属性。

可以找到使用对象作为数据源的必要接口here

答案 2 :(得分:6)

仅为了将来的需要。

在带有.NET Framework 4.5的Visual Studio 2013中,对于窗口属性,请尝试添加ElementName=window以使其正常工作。

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2, ElementName=window}"/>
</Grid>