2012-06-30 75 views
1

我想動態更改我的Class中的TextBlock文本。TextBlock中的綁定在WPF中不起作用

XAML碼

<TextBlock Name="Footer_text" Text=""/> 

C#

string footerMainMenuText = "Setting"; 
Binding set = new Binding(""); 
set.Mode = BindingMode.OneWay; 
set.Source = footerMainMenuText; 
Footer_text.DataContext = footerMainMenuText; 
Footer_text.SetBinding(TextBlock.TextProperty, set); 

我查了最後一行,並Footer_text.Text設置正確。 (Footer_text.Text="Setting"),但我的應用程序中的TextBlock不顯示「設置」。這裏有什麼問題?

+0

您是否嘗試從XAML中移除「Text =」「'? – user7116

回答

3

如果你有約束力 - 爲什麼不直接用XAML來做呢?看你的代碼,這是一種毫無意義的 - 你可能也只是去

Footer_text.Text = "Setting"; 

理論上,應該做在XAML或至少提供的東西它綁定到

<TextBlock Text="{Binding SomeProperty}" /> 

我不是當然,爲什麼你會將自己的「字符串」綁定到任何東西上......你有沒有需要綁定到文本屬性的對象?

而且使用

Binding("") 

是什麼呢?一條空白的路徑?不知道綁定目標會在那裏...你有沒有試過

Binding() 

取而代之?

編輯:

而且爲什麼你的綁定更新不及時的控制的原因,可能是因爲你還沒有綁定到其實現INotifyPropertyChanged或類似的接口的對象。該控件需要知道,當值發生變化,所以我會想象,結合「串」不給TextBlock的正確通知時,它改變

編輯2:

下面是一個簡單的例子結合工作:

我的窗口類Window.cs:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
     <TextBlock x:Name="txtName" Text="{Binding Name}"></TextBlock> 
      <Button Click="Button_Click">Click me 1</Button> 
      <Button Click="Button_Click_1">Click me 2</Button> 
     </StackPanel> 
    </Grid> 
</Window> 

後面的代碼中Window.xaml.cs

public partial class MainWindow : Window 
{ 
    SomeObjectClass obj = new SomeObjectClass(); 
    public MainWindow() 
    { 
     InitializeComponent(); 

     txtName.DataContext = obj; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     obj.Name = "Hello World"; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     obj.Name = "Goobye World"; 
    } 
} 

對象綁定到(與INotifyPropertyChanged的)

class SomeObjectClass : INotifyPropertyChanged 
{ 
    private string _name = "hello"; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string PropertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
    } 
} 

點擊按鈕改變SomeObject.Name,但它更新文本框。

+0

謝謝,你的代碼工作得很好。但對於我的應用程序doestn正常工作。我有三個類:(Window)MainWindow,(class)SomeObjetcClass和(Window)測試。 SomeObjectclass類似於你的類。將這兩個按鈕從MainWindow移動到測試。 MainWindows僅包含TextBlock。那麼它不工作。如果我點擊按鈕,請從測試類中單擊我1,文本hello不會更改。我應該在代碼中更改什麼,以便通過單擊此類中的按鈕來控制另一個類(test.cs)的文本塊? – Lucas

+0

這聽起來像你需要一些學費 - 你是新來的編程/ C#?基本上 - 如果你想改變test.cs中的值,你需要公開'obj'變量並將MainWindow實例傳遞給test.cs,以便引用obj變量。我認爲這樣做可能超出了StackOverflow的範圍:P – Charleh