WPF: 简单的TextBox数据绑定

59

我有这个类:

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>

但是字符串并没有显示出来。另外,如果使用 TimerCallback 定期更新字符串 Name2 ,我需要做些什么来确保在数据更改时更新文本框吗?


3
提示:您可以通过缩进四个空格或使用101010按钮来格式化代码,这样可以避免手动操作br标签和转义尖括号的麻烦。 - itowlson
3个回答

91

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 类中。


以下是在 MSDN 上实现 INotifyPropertyChanged 接口的示例(向下滚动到 DemoCustomer 实现): http://msdn.microsoft.com/zh-cn/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx - Juha Palomäki
按照您的示例,我执行了以下操作: <TextBox Text="{Binding Path=Name2}"/> <Label Content="{Binding Path=Name2}"></Label> 但是它没有起作用。 - Ph0b0x

10

仅供未来需求。

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

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

1
在 XAML 方面,<TextBox Text="Binding Name2, RelativeSource={RelativeSource AncestorType=Window}}"/> 一旦将 Name2 包含在 INotifyPropertyChanged 接口中。 - Wayne Lo

9
您的窗口没有实现网格所需的必要数据绑定通知,即INotifyPropertyChanged接口。
您的“Name2”字符串也需要是一个属性而不是公共变量,因为数据绑定是用于属性的。
实现将对象用作数据源所需的必要接口可以在此处找到here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接