2010-12-21 125 views
0

爲什麼點擊按鈕後文本塊中的文本不會改變?WPF - 綁定問題

XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 

    <TextBlock Text="{Binding Name}"/> 
    <Button Click="Button_Click" Grid.Row="1" Margin="20">Click Me</Button> 
</Grid> 

後面的代碼:

public partial class Window1 : Window, INotifyPropertyChanged 
{ 
    private Person _myPerson; 
    public Person MyPerson 
    { 
     get { return _myPerson; } 
     set 
     { 
      _myPerson = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("MyPerson")); 
      } 
     } 
    } 

    public Window1() 
    { 
     MyPerson = new Person { Name = "A" }; 
     DataContext = MyPerson; 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MyPerson = new Person { Name = "B" }; 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

回答

1
<TextBlock Text="{Binding Name}"/> 

在上面的代碼綁定屬性Name文本框和下面的代碼:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    MyPerson = new Person { Name = "B" }; 
} 

你設定MyPerson給新人。

這是打算? Person類實現INotifyPropertyChanged事件嗎?

您只更新MyPerson屬性。 DataContext仍具有對對象的引用,您創建使用下面一行:

MyPerson = new Person { Name = "A" }; 
在構造

。您還需要更新DataContext

相反,使用下面的代碼:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    MyPerson = new Person { Name = "B" }; 
    DataContext = MyPerson; 
}  
+0

不會更改點擊上的datacontext會對性能產生影響嗎?不應該使用相同的數據上下文對象。也許將其作爲類成員並在Person類上實現INotifyPropertyChanged以通知「Name」成員上的更改。然後,而不是說MyPerson =新人{名稱=「B」};如果讓Person對象的類成員爲mPerson那麼說,mPerson.Name =「B」。 – whoisthis 2010-12-21 10:43:34

+1

嗯,我在答覆中提到過。但OP沒有就此回覆。我仍然建議親自實施'INotifyPropertyChanged'並更改它的'Name'屬性,而不是創建一個全新的'Person'對象。 – decyclone 2010-12-21 10:49:38

+0

謝謝!澄清 – whoisthis 2010-12-21 11:30:23

0

您需要實現Person類INotifyPropertyChanged的,然後就改變MyPerson提高的PropertyChanged,這個名字,如果你希望它是清潔...

或者,你可以重新申請已創建到DataContext新創建的對象,否則將無法正常工作

1

變化

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

<TextBlock Text="{Binding MyPerson, Path=Name}"/> 

既然你綁定到名稱,NotifyPropertyChanged不會被上名稱當你改變MyPerson解僱和視圖不會被更新。