2009-11-12 66 views
42

我有这个类:WPF:简单的文本框数据绑定

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,那么在数据更改时是否需要执行任何操作以确保文本框已更新?

+2

作为提示,您可以通过缩进四个空格或使用101010按钮来格式化代码 - 手动保存br标签和转义角括号! – itowlson 2009-11-12 21:39:38

回答

63

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"); 
     } 
    } 
    } 
} 

你应该考虑这个移动到一个单独的数据对象,而不是在你的窗口类。

+0

MSDN实现INotifyPropertyChanged接口的示例(向下滚动到DemoCustomer实现):http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx – 2013-11-27 20:16:36

5

你的窗口没有实现必要的数据绑定通知,网格需要使用它作为数据源,即INotifyPropertyChanged接口。

您的“Name2”字符串还需要是属性而不是公共变量,因为数据绑定是用于属性的。

实现使用对象作为数据源的必要接口可以在here找到。

3

只是为了未来的需要。

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

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