2010-11-18 52 views
0

這是我簡單的xaml,它在文本框中顯示人員集合中第一個人的年齡。點擊後,我不明白我的年齡不變。Wpf - 綁定到收集項目的問題

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="132*" /> 
     <RowDefinition Height="179*" /> 
    </Grid.RowDefinitions> 
    <TextBlock Text="{Binding Persons[0].Age}" /> 
    <Button Grid.Row="1" Click="Button_Click">Change Age</Button> 
</Grid> 

這是XAML的後面的代碼:

public partial class MainWindow : Window 
{ 
    public ObservableCollection<Person> Persons { get; set; } 

    public MainWindow() { 
     Persons = new ObservableCollection<Person>(); 
     Persons.Add(new Person{Age = -1}); 

     DataContext = this; 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) { 
     (Persons[0] as Person).Age = 5; 
    } 
} 

這是類人:

public class Person : INotifyPropertyChanged 
{ 
    private int _age; 

    public int Age 
    { 
     get { return _age; } 
     set 
     { 
      _age = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("Age")); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 
+0

你的代碼對我來說工作的很好,當我將它粘貼到Visual Studio 2010中的WPF項目中的時候。你使用的是什麼版本的WPF和Visual Studio? – 2010-11-18 14:04:53

+0

工作對我來說很好。複製/粘貼到項目,它就像一個魅力。如果你爲Age設置了一個斷點,它會觸發PropertyChanged還是爲null? – 2010-11-18 14:18:35

回答

1

這可能是因爲認爲沒有趕上一個元素的一個屬性的名單改變了。它僅捕獲該列表改變(添加或刪除元素)

private void Button_Click(object sender, RoutedEventArgs e) { 

    (Persons[0] as Person).Age = 5; 
    Person p = Persons.First(); 
    Persons.Remove(0); 
    Persons.Add(p); 
} 
+0

但是這不應該是必須的,因爲Person類本身實現了INotifyPropertyChange。 (的確,原始代碼在我的系統上工作得很好。)這裏發生的所有事情是,單個Person對象的Age屬性正在改變 - 列表級通知甚至不是必需的。實際上,當我將ObservableCollection 替換爲列表時,它將繼續工作 - Person正在引發的屬性更改通知正常運行。 – 2010-11-18 14:03:57

+0

Person對象可能正在發送INotifyPropertyChange。但是你沒有綁定到Person,你綁定到ObservableCollection的第一個項目,所以它只捕獲集合中的添加或刪除。 – dcarneiro 2010-11-18 14:30:53

+0

你可以做一些事情,每個人''得到一個PropertyChange事件附加,觸發'Persons'集合改變事件 – Rachel 2010-11-18 17:24:20

0

你的代碼是正確的,你已經實現了INotifyPropertyChanged的您的類,所以都應該是不錯的。

你確定它沒有改變?

+0

是的,我敢肯定.. – Erez 2010-11-18 13:10:44

0

我試過你的代碼,它對我來說非常合適。我甚至改變了按鈕點擊處理程序,所以我可以繼續點擊並查看TextBlock更新。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    (Persons[0] as Person).Age = (Persons[0] as Person).Age + 1; 
}