2010-11-18 12 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; 
    } 
} 

これは、クラスの人です:ビューは一つの要素の1つの特性をキャッチしていないので、おそらくです

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のどのバージョンを使用していますか? –

+0

私のためにうまく働いた。プロジェクトにコピー/ペーストすると、チャームのように機能します。 Ageにsetでブレークポイントを設定すると、PropertyChangedが発生するか、それともnullですか? –

答えて

1

リストの変更。それだけであなたのコードが正しい、あなたがそう、すべてのクラスにINotifyPropertyChangedのを実装している良いことがあります(要素を追加または削除)、リストが変更されたことを

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が発生させているプロパティ変更通知は正しく機能しています。 –

+0

PersonオブジェクトはおそらくINotifyPropertyChangeを送信しています。しかし、あなたはPersonにバインドしていないので、ObservableCollectionの最初の項目にバインドしているので、Collectionに追加または削除されたものだけがキャッチされます。 – dcarneiro

+0

それぞれの 'Person'が' Persons'コレクション変更イベントをトリガーするPropertyChangeイベントを添付した何かを行うことができます – Rachel

0

をキャッチ。

本当に変わらないのですか?

+0

はい、私は確信しています.. – Erez

0

私はあなたのコードを試してみて、それは私にとって完璧に機能しました。私はボタンクリックハンドラを変更したので、クリックしてTextBlockの更新を確認することもできました。

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