8
votes

ListView non mis à jour correctement avec Observablecollection

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(); });

    }


0 commentaires

3 Réponses :


2
votes

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.


0 commentaires

2
votes

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


5 commentaires

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


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



5
votes

Vous devez utiliser des techniques de liaison de données correctes, puis cela fonctionnera automatiquement.

requis ...

  1. Implémentez InotifyPropertychangned sur votre classe à l'intérieur de l'observablecollection (et assurez-vous que vous déclenchez l'événement lorsque vous définissez des propriétés sur cette classe)
  2. Dans votre articleTemplate de ListView's, assurez-vous que vous utilisez la liaison avec les propriétés

    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.

    Mise en œuvre inotifyPropertychangned sur votre classe à l'intérieur de l'observaCollection ... (recherchez la classe BindableBase si vous ne donez pas 't sais déjà) xxx

    Votre listeView xxx

    Votre Observablecollection ... xxx

    Ajout de choses à la collection fonctionne ... xxx

    et mettez à jour, ce que vous demandiez, fonctionne ... xxx

    aucun appels sur "Actualiser" ou autre chose. L'article lui-même est mis à jour, sans la modification de la liste.

    avant de mettre à jour l'élément 4 ...

     avant de mettre à jour l'élément 4 < / p>

    après la mise à jour de l'élément 4 ...

    après la mise à jour de l'élément 4

    Code complet Échantillon disponible ici: échantillon de code < / a>


1 commentaires

Cela a parfaitement travaillé pour moi. Merci, @andrew