2010-11-18 8 views
0

c'est mon simple xaml qui montre dans une zone de texte l'âge de la première personne dans une collection de personnes. Je ne comprends pas, je clique après que l'âge ne change pas.Wpf - problème avec la liaison à un élément de la collection

<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> 

c'est le code derrière du 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; 
    } 
} 

c'est une personne de classe:

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

Votre code a bien fonctionné pour moi lorsque je l'ai collé dans un projet WPF dans Visual Studio 2010 maintenant. Quelle version de WPF et Visual Studio utilisez-vous? –

+0

A travaillé très bien pour moi. Copier/coller au projet et cela fonctionne comme un charme. Si vous définissez un point d'arrêt dans set pour Age, lance-t-il PropertyChanged ou est-il null? –

Répondre

1

qui est probablement parce que la vue ne se coincent pas une propriété d'un élément de la liste a changé. Il attrape seulement que la liste modifiée (ajouter ou supprimer des éléments)

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

Mais cela ne devrait pas être nécessaire car la classe Person elle-même implémente INotifyPropertyChange. (En effet, le code d'origine fonctionne très bien sur mon système.) Tout ce qui se passe ici est que la propriété Age d'un objet Personne individuel est en train de changer - les notifications au niveau de la liste ne sont même pas nécessaires. En fait, lorsque je remplace ObservableCollection avec la liste , il continue à fonctionner - les notifications de modification de propriété que la personne soulève fonctionnent correctement. –

+0

L'objet Person envoie probablement l'objet INotifyPropertyChange. Mais vous n'êtes pas lié à la Personne, vous liez le premier élément d'une ObservableCollection, de sorte qu'elle n'obtient que des ajouts ou des suppressions de la Collection. – dcarneiro

+0

Vous pouvez faire quelque chose où chaque 'Person' obtient un événement PropertyChange attaché qui déclenche la collection' Persons' a changé l'événement – Rachel

0

Votre code est correct, vous avez implémenté INotifyPropertyChanged votre classe donc tout devrait être bon.

Etes-vous sûr que cela ne change pas?

+0

Oui, je suis sûr .. – Erez

0

J'ai essayé votre code et cela a fonctionné parfaitement pour moi. J'ai même changé le gestionnaire de clic de bouton afin que je puisse continuer à cliquer et voir la mise à jour TextBlock.

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