INotifyPropertyChange ~ PropertyChanged qui ne se déclenche pas lorsque le bien est une collection et un nouvel élément est ajouté à la collection
J'ai une classe qui implémente l'interface INotifyPropertyChanged. Certaines des propriétés de la classe sont de type Liste. Par exemple:
public List<string> Answers
{
get { return _answers; }
set
{
_answers = value;
onPropertyChanged("Answers")
}
}
...
private void onPropertyChanged(string propertyName)
{
if(this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Si je attribuer une nouvelle Liste<string> pour Répondre, puis de l'événement PropertyChanged feux comme prévu; mais si j'ajoute une chaîne de caractères chaîne de caractères dans la liste des Réponses à l'aide de la Liste Ajouter une méthode, puis l'événement PropertyChanged ne pas le feu.
J'envisage l'ajout d'un AddAnswer() la méthode de ma classe, qui permettrait de gérer l'appel de la listes méthode Add de et appelle onPropertyChanged() à partir de là, mais est-ce la bonne façon de le faire? Est-il une façon plus élégante de le faire?
Cheers,
KT
OriginalL'auteur eponymous23 | 2010-06-07
Vous devez vous connecter pour publier un commentaire.
Vous devriez exposer une
ObservableCollection<string>
, qui met en œuvre laINotifyCollectionChange
interface pour élever ses propres événements de changement.Vous devez également supprimer l'accesseur de propriété Les propriétés de Collection doit être en lecture seule.
Vous ne devriez pas soulever la
PropertyChanged
cas lorsque le contenu de la collection de changement.Assurez-vous de regarder à travers les questions sans réponse et de payer de l'avant par le partage de votre expertise. Ce site fonctionne parce que les gens donnent en retour.
Merci beaucoup... !
OriginalL'auteur SLaks
Ok je viens enfin connu ce problème, et il n'y a PAS de réponses complètes sur l'Internet afaikt, donc, ici est la pièce manquante que personne ne parle de la (peut-être parce que le supposons que nous ne sommes pas des crétins absolus et ne l'ont PAS supprimé le constructeur par défaut, ou ont alteast étendu le constructeur par défaut de toute façon:
Assurez-vous que vous NE supprimez PAS la InitializeComponent(); appel du constructeur de votre point de Vue.
Sans cet appel AVANT de mettre le DataContext de la vue, NotifyPropertyChanged Événement sera TOUJOURS NULL. J'ai passé 2 heures à essayer de comprendre ce qui est différent entre les deux MVVM userControls. Je suppose que mon esprit est tellement habitué à voir InitializeComponent(); qu'il n'a pas compris que c'était manquant. J'ai ajouté que le dos et l'alto!
Espère Que Cela Aide D'Autres Les Nuls Comme Moi!
Cheers,
Code Guerrier Malo
Merci pour cette! J'ai eu le même problème. J'avais fait ma classe comme une classe C# standard, mais après le passage à un Formes XAML avec le code derrière elle a commencé à travailler (il semble que vous devez le code derrière XAML pour obtenir le
InitializeComponent()
méthode de travail)OriginalL'auteur Code WarriorMalo
Ce n'est pas le tir, car la collection de référence ne change pas, juste le contenu. Vous auriez besoin de la collecte de la méthode Add() pour déclencher l'événement pour être en mesure de le voir.
OriginalL'auteur Josh Sterling
ont un coup d'oeil au Système.Les Collections.ObjectModel.ObservableCollection. http://msdn.microsoft.com/en-us/library/ms668604.aspx
Il peut être utilisé comme une Liste, mais a des événements intégrée lors de la modification de son contenu.
OriginalL'auteur William Leader
ObservableCollection est votre réponse. Si vous voulez le feu sur la collecte des modifications de la propriété, vous aurez besoin d'implémenter INotifyPropertyChanged pour chacune des propriétés que vous souhaitez suivre.
OriginalL'auteur Robaticus
Vous devez ajouter un écouteur d'événement à votre
_answers
collection. Malheureusement,List<T>
ne fournit pas un tel événement.Comme une suggestion, gérer
_answers
comme unObservableCollection<string>
, et bien attacher/détacher un gestionnaire d'événements pour l'CollectionChanged
événement, comme suit:OriginalL'auteur Humberto