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