2009-11-12 62 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>