Je suis actuellement en train d'utiliser une collection observable pour stocker mes objets de données pour une liste de réception. L'ajout de nouveaux objets à la collection fonctionne simplement bien et la liste de réception est correctement mise à jour. Toutefois, lorsque j'essaie de changer l'une des propriétés d'un objet dans la collection, la liste ne sera pas mise à jour correctement. Par exemple, j'ai un datacollection de collection observable. J'essaie
button1_Click(...) { this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, (NoArgDelegate)delegate { _DataCollection.ElementAt(count).Status = "Active"; myListView.Items.Refresh(); }); ExecuteLongOperation(); this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, (NoArgDelegate)delegate { _DataCollection.ElementAt(count).Status = "Finished"; myListView.Items.Refresh(); }); }
3 Réponses :
Vous avez rencontré le problème classique avec Observablecollection. Il n'indique que lorsqu'un élément est ajouté ou supprimé. Il ne notifie pas quand une propriété d'un article dans la collecte change. Si vous souhaitez être informé de ces modifications, vous devrez faire votre propre collection personnalisée et ajouter / supprimer les événements de propriété de la propriété sur les objets individuels manuellement. Désolé, mec. p>
Pour résoudre ce problème, j'ai créé une classe appelée trèsobservablecollection. Pour chaque objet que vous ajoutez, il accroche à l'événement NotifyProperTychanged de l'objet à un gestionnaire qui déclenche un événement de collection. Pour chaque objet retiré, il supprime le gestionnaire. Très simple et vous donnera exactement ce que vous voulez. Code partiel:
J'ai besoin de beaucoup de temps pour trouver la bonne implémentation de la méthode affectant_propertychanged. Vous n'avez besoin que d'une ligne: mybase.onCollectionChangedeventargs (notifyCollectionChangeDacteDeSet (notifyCollectionChangeDacted on.ReSet)) je vous recommande d'écraser l'insertItem et le remodelage de Observablecollection, car Settitem n'a pas fonctionné pour moi.
@Felix, oui, il y en avait plus. La mise en œuvre de la classe est supérieure à 800 lignes. J'ai dit que j'avais posté du code partiel, principalement pour donner l'idée générale.
J'ai écrit cela pour d'autres personnes qui trouvent ce post et je sais pas comment implémenter ces lignes de code. Ce n'était pas une correction, juste une extension pour obtenir ce travail. :) Mais pourquoi votre classe a une longueur de 800 lignes? J'aimerais vraiment apprécier votre implémentation de la classe complète.
J'ai ajouté un certain nombre d'extensions. La mise en œuvre de base uniquement pour définir le gestionnaire d'événements est inférieure à 200 lignes et remplace SetItem, Clearitems, RefinitionItem, Insérer, et le constructeur avec quelques petites choses mineures.
Toutes mes excuses pour la baisse, mais ce n'est pas une solution complète car elle comprend une méthode de la mise en œuvre et du nombre approximatif de lignes de la solution finale au problème + indices utiles dans les commentaires de @ Felix-C.
Vous devez utiliser des techniques de liaison de données correctes, puis cela fonctionnera automatiquement.
requis ... p>
Si vous faites ces deux choses, il n'y a pas besoin d'un appel "rafraîchir" ou autre chose. Définition d'une propriété qui déclenche InotifyPropertyChanged entraînera la mise à jour de la mise à jour de l'élémentTemplate. P>
Votre listeView forte> p> Ajout de choses à la collection fonctionne ... strong> p> et mettez à jour, ce que vous demandiez, fonctionne ... strong> p> aucun appels sur "Actualiser" ou autre chose. L'article lui-même est mis à jour, sans la modification de la liste. P> après la mise à jour de l'élément 4 ... strong> p>
Cela a parfaitement travaillé pour moi. Merci, @andrew