IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Clear une Observable Collection et Binding dans une ListView


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut Clear une Observable Collection et Binding dans une ListView
    Bonjour,

    Je suis en train de galérer sur les ObservableCollection et les binding dans une ListView.
    J'ai remarqué que lorsqu'on clear() une ObservableCollection, si un item était sélectionné dans la ListView il va rester sélectionner après le clear().
    Ce qui pose problème lorsqu'on effectue d'autres opérations après la suppression de liste.
    J'ai essayé de faire un listView.SelectedItems.Clear() mais cela ne résout pas le problème.
    Je suis passé en Binding Mode=TwoWay sur ma listView et j'ai ajouté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private ObservableCollection<maClasse> objectCollection = new ObservableCollection<maClasse>();
    public ObservableCollection<maClasse> ObjectCollection { get { return objectCollection ; } set { objectCollection = value; NotifyPropertyChanged("objectCollection "); }
    Je n'ai pas vraiment eu gain de cause sur mon problème ...
    Auriez-vous une solution pour palier à ce phénomène ?

    Merci par avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Peut-on en savoir plus sur la manière dont tu utilises la ListView et l'ObservableCollection?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Oui c'est vrai qu'il manque un peu le contexte.
    Pour faire simple, j'ai une application WPF qui a pour fenêtre principale une ListView comme conteneur.
    J'ai également des boutons pour importer / exporter les données et faire un reset du ListView.
    Là où je rencontre des difficultés, c'est quand avant un second import, je supprime les éléments de ma liste (reset).
    Le dernier éléments sélectionné reste sélectionné après un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objectCollection.Clear();
    ou un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listView.SelectedItems.Clear();
    .
    Ce qui fait que mes tests pour savoir si un élément est sélectionné avant de procéder à des opérations sur mes items sont biaisés ainsi que la valeur du SelectedItems qui contient 2 éléments alors qu'il y en a qu'un seul sélectionné du côté de l'UI ...
    J'ai pensé que c'était une histoire de binding mais je n'en suis pas vraiment sûr.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Probablement, mais dans tous les cas, il faut nous montrer plus de code. Là par exemple il faudrait que je saches si par exemple tu as renseigné un DataContext, comment la classe associée est organisée, etc...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Non je n'ai pas géré de dataContext.
    Je suis arrivé à me dépatouiller autrement, je pense qu'il faut que je me renseigne un peu plus sur le binding en mode TwoWay ...
    Connaitrais-tu un bon tuto là dessus ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Petit Rasta Voir le message
    Non je n'ai pas géré de dataContext.
    Je suis arrivé à me dépatouiller autrement, je pense qu'il faut que je me renseigne un peu plus sur le binding en mode TwoWay ...
    Connaitrais-tu un bon tuto là dessus ?
    Tu ne gère donc pas de DataContext, cela veut dire que lorsque tu associe ta liste dans le code XAML, tu indiques alors que la source est la fenêtre elle-même?

    En fait dans ce cas de figure, le DataBinding "TwoWay" n'a absolument aucune influence sauf si tu modifies le pointeur de liste "ObservableCollection", ce qui n'a aucun intérêt dans ce cas.

    le binding "TwoWay" est utile si tu peux aussi bien modifier une valeur directe aussi bien depuis la vue que depuis le modèle. Par exemple si tu as un champ texte databindé à une propriété "Toto", tu verras une modification si tu modifies aussi bien la valeur de l'IHM que la propriété "Toto" (mais dans ce dernier cas, la classe contenant la propriété "Toto" doit implémenter "INotifyPropertyChanged" et bien faire remonter le message via cette interface).

    Avec un objet "ObservableCollection", ce n'est pas pareil : grâce au fait qu'il y a une notification "CollectionChanged", il n'est pas nécessaire que la propriété "ObservableCollection" ait un accesseur "Set" puisque seuls les éléments à l'intérieur sont modifiés.

    Après, comme tu ne nous avais pas montré le code que je t'avais demandé...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 200
    Points : 76
    Points
    76
    Par défaut
    Merci pour ta réponse.
    Effectivement j'utilise des ObservableCollection et en théorie le code ne change que via le code-behind.
    Cependant j'ai tout de même implémenter l'interface INotifyPropertyChanged dans mes classes objets.
    D'ailleurs j'ai trouvé mon dataContext :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DataContext="{Binding RelativeSource={RelativeSource Self}}"
    C'est bien la fenêtre elle-même. Mon binding est comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ItemsSource="{Binding ObjectCollection }"
    J'avais remarqué que lorsque je modifiais mon objet, par exemple en lui changeant son statut, il n'était pas modifié au niveau de l'UI. En faisant une notification explicite, celui-ci est bien modifié.
    Dans mon cas je n'ai pas besoin du mode TwoWay mais dans ce cas, je ne comprends pas pourquoi lorsque je clear ma ObservableCollection, celle-ci ne notifie pas la listView ?
    Enfin si elle est bien notifiée puisque les éléments sont bien supprimés côté UI, c'est uniquement la propriété SelectedItems de ma listView qui n'est pas prugé.
    C'est vraiment ça qui me choc ...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Petit Rasta Voir le message
    ...Enfin si elle est bien notifiée puisque les éléments sont bien supprimés côté UI, c'est uniquement la propriété SelectedItems de ma listView qui n'est pas purgée.
    C'est vraiment ça qui me choc ...
    Je vais me faire un petit test de cela quand j'aurais l'occasion, c'est un sujet intéressant...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/07/2007, 09h34
  2. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  3. Réponses: 1
    Dernier message: 16/05/2007, 12h51
  4. [MySQL] récupérer dans une boucle chaque information MySQL dans une variable différente
    Par gtenthorey dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 22h34
  5. Réponses: 2
    Dernier message: 20/06/2006, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo