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 :

Trier une ObservableCollection


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut Trier une ObservableCollection
    Bonjour,
    Je cherche à maintenir un ordre dans mon ObservableCollection pour avoir un affichage cohérent dans une treeview derrière.
    J'ai implémenté un int Compare(object x, object y), mais ObservableCollection n'a pas de méthode sort, ni de possibilité d'ajouté en respectant ce comparateur... Une idée de comment faire ? Existe-t-il une autre collection observable qui possède ces méthodes ?
    (Chaque objet de mon OC en possède une autre jusqu'à descendre au troisième niveau, et la treeview me permet d'afficher ça comme l'explorateur windows, je suis débutant et j'ai pas mal galérer déjà pour faire un binding correct...)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    N'essaie pas de maintenir l'ordre au niveau de la collection, tu vas galérer et ça ne sert à rien... Gère plutôt ça au niveau de la vue (ICollectionView) : quand tu bindes un contrôle à une collection, ça crée implicitement une vue sur la collection. Tu peux ajouter à cette vue des critères de tri ou de filtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ObservableCollection<Toto> collection = ...
    ICollectionView view = CollectionViewSource.GetDefaultView(collection);
    view.SortDescriptions.Add(new SortDescription("UnePropriété", ListSortDirection.Ascending));

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    Et là tu binderais sur la propriété view ?
    J'avais en effet vu ça en faisant des recherches sur google, le problème c'est que mon comparateur est particulier, ma propriété sur laquelle je veux trier est complexe et un simple "ListSortDirection.Ascending" qui correspond à l'ordre croissant / alphabetique je suppose, ne peut par ordonner ce type d'objet... D'où la nécessité d'implémenter un comparateur à côté, et de trier correctement.. Je travaille de plus sur un grand nombre d'objet, et je pense qu'il est bien moins couteux d'insérer au bon endroit que de retrier tout à chaque fois...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    Et là tu binderais sur la propriété view ?
    Non, directement sur l'ObservableCollection... CollectionViewSource.GetDefaultView renvoie la même CollectionView qui est utilisée par le binding

    Citation Envoyé par Flaburgan Voir le message
    J'avais en effet vu ça en faisant des recherches sur google, le problème c'est que mon comparateur est particulier, ma propriété sur laquelle je veux trier est complexe et un simple "ListSortDirection.Ascending" qui correspond à l'ordre croissant / alphabetique je suppose, ne peut par ordonner ce type d'objet... D'où la nécessité d'implémenter un comparateur à côté, et de trier correctement.. Je travaille de plus sur un grand nombre d'objet, et je pense qu'il est bien moins couteux d'insérer au bon endroit que de retrier tout à chaque fois...
    Ah ok... dans ce cas tu peux utiliser la propriété ListCollectionView.CustomSort, qui permet de spécifier un comparateur personnalisé :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ObservableCollection<Toto> collection = ...
    ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(collection);
    view.CustomSort = new TotoComparer();
     
     
    ...
     
    public class TotoComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            Toto tx = (Toto)x;
            Toto ty = (Toto)y;
     
            // Ta logique de tri ici
            ...
        }
    }

  5. #5
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Par défaut
    Ca marche !!
    Grand merci !

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

Discussions similaires

  1. [MVVM] Trier une ObservableCollection
    Par DotNET74 dans le forum Windows Phone
    Réponses: 5
    Dernier message: 05/09/2013, 15h29
  2. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18
  3. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44
  4. [langage] Trier une hastable
    Par Gogoye dans le forum Langage
    Réponses: 11
    Dernier message: 03/08/2004, 16h43
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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