Search code examples
wpfdata-bindingtextbox

WPF: simple TextBox data binding


I have this class:

public partial class Window1 : Window
{
    public String Name2;

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

    // ...
}

And I want to display the string Name2 in the textbox.

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

But the string isn't displayed. Also, if the string Name2 is updated periodically using a TimerCallback, do I need to do anything to make sure the textbox is updated when the data changes?


Solution

  • Name2 is a field. WPF binds only to properties. Change it to:

    public string Name2 { get; set; }
    

    Be warned that with this minimal implementation, your TextBox won't respond to programmatic changes to Name2. So for your timer update scenario, you'll need to implement 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");
          }
        }
      }
    }
    

    You should consider moving this to a separate data object rather than on your Window class.