2009-06-05 6 views
4

Dans un modèle de vue, j'ai une collection d'éléments de type « ClassA » appelés « MaCollection ». ClassA a une propriété nommée "IsEnabled".WPF - OnPropertyChanged pour une propriété dans une collection

class MyViewModel 
{ 
    List<ClassA> MyCollection { get; set; } 

    class ClassA { public bool IsEnabled { get; set; } } 
} 

Ma vue possède une grille de données qui se lie à MyCollection. Chaque ligne a un bouton dont l'attribut « IsEnabled » est lié à la propriété IsEnabled de ClassA.

Lorsque les conditions dans la vue changement de modèle tel qu'un élément particulier dans la liste des MyCollction doit se plier être désactivé, je mis la propriété IsEnabled false:

MyCollection[2].IsEnabled = false; 

Je veux maintenant informer la vue de cette change avec un événement OnPropertyChanged, mais je ne sais pas comment faire référence à un élément particulier dans la collection.

OnPropertyChanged("MyCollection"); 
OnPropertyChanged("MyCollection[2].IsEnabled"); 

les deux ne fonctionnent pas.

Comment avertir la vue de ce changement? Merci!

Répondre

12

ClassA doit mettre en œuvre INotifyPropertyChanged:

class ClassA : INotifyPropertyChanged 
{ 
    private bool _isEnabled; 
    public bool IsEnabled 
    { 
     get { return _isEnabled; } 
     set 
     { 
      if (value != _isEnabled) 
      { 
       _isEnabled = value; 
       OnPropertyChanged("IsEnabled"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

EDIT: et utiliser un ObservableCollection comme Scott a dit

EDIT2: en invoquant l'événement PropertyChanged plus court

+0

Le ObservableCollection n'est pas nécessaire - mettre en œuvre INotifyPropertyChanged était suffisante . Merci! –

+1

Eh bien, il suffit d'être averti lorsque IsEnabled est modifiée, mais si des éléments sont ajoutés ou supprimés de MyCollection, vous ne serez pas informé à moins qu'il soit un ObservableCollection (ou toute classe qui implémente INotifyCollectionChanged) –

6

Au lieu d'utiliser une liste, essayez d'utiliser un ObservableCollection. En outre, modifier votre ClassA afin qu'il implémente INotifyPropertyChanged, en particulier pour la propriété IsEnabled. Enfin, modifiez votre classe MyViewModel il met également en œuvre INotifyPropertyChanged, en particulier pour la propriété MyCollection.

Questions connexes