Подтвердить что ты не робот

WPF: простая привязка данных 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, нужно ли что-либо сделать, чтобы убедиться, что текстовое поле обновлено при изменении данных?

4b9b3361

Ответ 1

Name2 - это поле. WPF привязывается только к свойствам. Измените его на:

public string Name2 { get; set; }

Обратите внимание, что с этой минимальной реализацией ваш TextBox не будет реагировать на программные изменения в Name2. Таким образом, для вашего сценария обновления таймера вам необходимо реализовать INotifyPropertyChanged:

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

  // usual OnPropertyChanged implementation

  private string _name2;

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

Вы должны переместить это в отдельный объект данных, а не в свой класс Window.

Ответ 2

В вашем окне не выполняются необходимые уведомления о привязке данных, которые сетка требует использовать в качестве источника данных, а именно INotifyPropertyChanged интерфейс.

Строка "Name2" также должна быть свойством, а не общедоступной переменной, поскольку привязка данных используется для свойств.

Реализация необходимых интерфейсов для использования объекта в качестве источника данных можно найти здесь.

Ответ 3

Просто для будущих потребностей.

В Visual Studio 2013 с .NET Framework 4.5 для свойства окна попробуйте добавить ElementName=window, чтобы он работал.

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