WPF: простая привязка данных TextBox - PullRequest
49 голосов
/ 13 ноября 2009

У меня есть этот класс:

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 ]

73 голосов
/ 13 ноября 2009

Имя2 - это поле. 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.

7 голосов
/ 13 ноября 2009

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

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

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

6 голосов
/ 11 июня 2015

Только для будущих нужд.

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

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2, ElementName=window}"/>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...