2009-11-06 65 views
2


我对WPF概念很陌生。我只想在文本框中显示一个字符串。我尝试了下面的C#代码和XAML将一个字符串绑定到TextBox.Text属性。 C#代码:从代码背后的数据到XAML的简单绑定

public partial class Window1 : Window 
{ 
    public int TmpVal; 
    public string TmpStr; 

    public Window1() 
    { 
     TmpVal = 50; 
     TmpStr = "Windows Created"; 
     InitializeComponent(); 
     this.DataContext = this; 
    } 
    private void viewButton_Click(object sender, RoutedEventArgs args) 
    { 
     TmpStr = "Button clicked"; 
    } 
} 

}

XAML:

<Window x:Class="TestWPF.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="600" Width="800" x:Name="ThisWindow"> 
<Grid> 
    <TextBox Name="txtTest1" Margin="200,0,200,200" HorizontalAlignment="Left" Height="50" Width="200" Text="{Binding TmpStr, ElementName=ThisWindow}" /> 
    <Button Name="butTest1" Click="viewButton_Click">Test123</Button> 
</Grid> 
</Window> 

在执行时我总是空白文本在我的文本框(甚至当我调用的单击事件)。
我浏览了stackoverflow网站,但无法解决问题(虽然很多问题都接近这个问题)
有人可以建议我,如果有什么被忽视或错过?

回答

5

数据绑定不适用于字段。而是使用属性:

public int TmpVal {get; set;} 
public string TmpStr {get; set;} 

另外如果你想在文本框中自动拾取从数据的变化,你会非常需要执行INotifyPropertyChanged或使其依赖属性 或为每个XXX财产 一个XXXChanged事件( 这不再起作用)。

<Window x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" x:Name="ThisWindow"> 
    <StackPanel> 
     <TextBox Name="txtTest1" Text="{Binding TmpStr, ElementName=ThisWindow}" /> 
     <Button Name="butTest1" Click="viewButton_Click">Test123</Button> 
    </StackPanel> 
</Window> 

而后面的代码:

public partial class Window1 : Window, INotifyPropertyChanged 
{ 
    public Window1() 
    { 
     this.TmpStr = "Windows Created"; 
     this.InitializeComponent(); 
     this.DataContext = this; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string TmpStr { get; set; } 

    public int TmpVal { get; set; } 

    private void viewButton_Click(object sender, RoutedEventArgs args) 
    { 
     this.TmpStr = "Button clicked"; 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs("TmpStr")); 
     } 
    } 
} 
+0

为什么XXXChanged事件不工作了?我在哪里可以读到这个? – 2009-11-06 12:11:17

+0

我认为只有在一些CTP或v1的早期beta版本中才有。 – bitbonk 2009-11-06 12:44:38

+0

您应该在Property Setter中实现'PropertyChanged'代码。因此,如果你的财产被代码更改,UI将更新。 – ChrisF 2009-11-09 13:37:50