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

Windows Presentation Foundation Discussion :

listView+Bind avec ObservableCollection, indispensable ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut listView+Bind avec ObservableCollection, indispensable ?
    Bonjour,

    le sujet a déjà été soulevé à maintes reprises mais je sollicite votre expérience pour ce sujet.

    J'ai réalisé une listView contenant des données provenant d'un fichier XML.

    J'ai bindé cela avec un XMLDataProvider.

    A aucun moment je n'ai utilisé les ObservableCollection, mais maintenant pour la suite de mon projet, je ne sais pas si je dois m'y mettre ou pas.

    J'ai créé des fonctions Add, Insert, Delete pour ma listView. Cela fonctionne très bien en travaillant directement sur le XML

    exemple méthode Delete qui ajoute une ligne à ma listView

    Code : 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
    private void Delete_Click(object sender, RoutedEventArgs e)
            {
                int selectIndexLine;
     
                xdpData = FindResource(xdpDataName) as XmlDataProvider;
                xmlDocData = xdpData.Document;
     
                //set indexLine everytime we click on listView
                selectIndexLine = listView.Items.IndexOf(listView.SelectedItem);
                //Node from XML begin to 1 and not 0
                selectIndexLine++;
     
                //delete the node select from listView only if there is unless one element
                if (selectIndexLine > 0)
                    xmlDocData.DocumentElement.RemoveChild(xmlDocData.DocumentElement.SelectSingleNode(trackPathXML + "[" + selectIndexLine + "]"));
            }
    J'ai également réalisé une fonction de tri de ma listView en me basant sur http://www.switchonthecode.com/tutor...t#comment-2587

    cette fonction de tri m'a un peu chamboulé mes méthodes insert, et delete.

    Comme j'agis directement entre fichier XML et listView sans passer par ObservableCollection, je me servais pour Deleter un row par exemple de l'index du row dans ma listView. Chose qui n'est plus possible en triant mes enregistrements, vu qu'il est possible que l'élément 1 de ma listView corresponde à l'élément 3 dans mon fichier XML par exemple. Ce qui fait que je pointe sur le mauvais row.

    Ma question (finalement) est la suivante:

    - Est-ce qu'il serait judicieux d'ajouter une balise <id> dans mon fichier XML et m'en servir dans le code behind pour, même en cas de tri, bien sélectionné l'élément choisi à l'écran ?? et ainsi continuer d'interragir directement avec le fichier XML (peut-être archaique mais assez simple)

    - passer par les ObservableCollection (est-ce que cela me faciliterait la vie à la longue ??? )

    Merci de vos commentaires...

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    pour le binding c'est presque obligatoire d'avoir des observable collection ou alors tu faire une couche style MVVM qui la possedera
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Comme le dis ikeas, Les observableCollection sont quasi indispensables (et j'ajouterai meme l'utilisation de mvvm !!! ) dans le sens où :
    - 1) tu souhaites avoir un projet propre et maintenable facilement
    - 2) Pouvoir travailler sous blend pour le design sans te soucier du code behind
    - 3) Ajouter des fonctionnalités sans devoir tout reprendre à chaque fois ou passer par des détournements (comme tu le fais avec ton champs id).

    Je te conseille sincerement l'utilisation de mvvm + observableCollection l'essayer c'est l'adopter !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    je dirais meme plus : poils au nez !!!!!
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    merci pour vos commentaires.

    J'ai fait des recherches sur les Observable Collection, mais je n'ai pas trouvé quelquechose qui reprend directement le contenu d'un fichier XML.

    Comment dois-je m'y prendre pour "ranger" mes données XML dans une ObservableCollection ??

    Merci d'avance

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    le mieux c'est de parser ton xml pour remplir une colletion
    ou alors mieux si tu peux definir le xml toi meme
    d'utiliser un enregistrement de tes fichier en xml a partir d'une collection comme ceci et de la loader de la meme facon
    je te file le code tu remplacera les nom d'objet
    Code : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     public void Save(string FileName)
            {
                TextWriter writer = null;
                try
                {
                    XmlSerializer serializer = new XmlSerializer(this.GetType());
                    writer = new StreamWriter(FileName);
                    serializer.Serialize(writer, this);
                    writer.Close();
                    writer = null;
                    this._OpenMode = OpenMode.Open;
                }
                catch (Exception ex)
                {
                    string s = ex.Message + "\n";
                    if (ex.InnerException != null)
                    {
                        s += ex.InnerException.Message + "\n";
                        if (ex.InnerException.InnerException != null)
                            s += ex.InnerException.InnerException.Message + "\n";
                    }
                    MessageBox.Show("Error during reading project file\n" + s, "Project" ,MessageBoxButton.OK,MessageBoxImage.Stop);
                }
                if (writer != null) writer.Close();
            }
     
            public static Project Load(string FileName)
            {
                FileStream fs = null;
                XmlTextReader reader = null;
                Project ret = null;
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(Project));
                    fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                    reader = new XmlTextReader(fs);
                    ret = serializer.Deserialize(reader) as Project;
                    reader.Close();
                    reader = null;
                    fs.Close();
                    fs = null;
                    if (ret == null) ret = Project.None;
                    ret._OpenMode = OpenMode.Open;
                    return ret;
                }
                catch (Exception ex)
                {
                    string s = ex.Message + "\n";
                    if (ex.InnerException != null)
                    {
                        s += ex.InnerException.Message + "\n";
                        if (ex.InnerException.InnerException != null)
                            s += ex.InnerException.InnerException.Message + "\n";
                    }
                    MessageBox.Show("Error during reading project file\n" + s, "Project" ,MessageBoxButton.OK,MessageBoxImage.Stop);
                }
                if (reader != null) reader.Close();
                if (fs != null) fs.Close();
                return new Project();
            }
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    Oui je définis moi même le XML.

    Pour le parsage, je l'avais déjà effectué dans un autre contexte, donc ca c'est bon.

    Ce que je ne vois pas, c'est comment, une fois que tu as ton XML dans une variable, comment tu créés ton ObservableCollection

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Je rejoins les avis précédents, il serait plus simple lire tes données (xml pour l'instant, peut être autre chose demain), de remplir des objets à partir de ces données, d'insérer ces objets dans une collection (ObservableCollection ou bien CollectionViewSource pour faciliter les opérations de tris, regroupements, filtres).

    Pour info, je n'ai jamais vu d'exemples travaillant directement à partir de la source de données (ou peut-être quelques fois dans des démonstrations où l'accès aux données n'est pas le sujet, la priorité). Généralement, on passe par une couche objet métier .

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,
    Pour info, je n'ai jamais vu d'exemples travaillant directement à partir de la source de données (ou peut-être quelques fois dans des démonstrations où l'accès aux données n'est pas le sujet, la priorité). Généralement, on passe par une couche objet métier .
    je confirme d'ailleurs si tu,utilise le code que je t'ai file tu devrais y arriver facil
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par ikeas Voir le message
    je confirme d'ailleurs si tu,utilise le code que je t'ai file tu devrais y arriver facil
    ok, mais dans ton code, à quoi correspond "Projet" ?

    Est-ce que c'est la balise de "départ" de ton XML ?


    Ce que je ne vois pas, c'est comment, une fois que tu as ton XML dans une variable, comment tu créés ton ObservableCollection
    Une fois que j'ai mon XML en code behind, comment faire pour le mettre dans une ObservableCollection ?

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    projet c'est la classe que tu veux enregister
    quand tu est dans la methode save c'est this.gettype
    quand on est dans la methode static load c'est le typeof

    remplace projet par ce que tu veux (enfin par ta classe a enregister)
    apres charge ta classe et lance le save
    regarde le xml (pour info)
    apres tu peux tenter un load
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Bindy Voir le message
    Une fois que j'ai mon XML en code behind, comment faire pour le mettre dans une ObservableCollection ?
    Merci beaucoup pour les infos, les méthodes marchent sans problème, mais ce que je ne comprends pas, c'est comment quand tu récupères tes valeurs depuis ton XML tu arrives à "ranger" tes données dans ton ObservableCollection, et ca commence de bien me prendre du temps, je trouve rien de rien!

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    ben c'est fait automatiquement, sinon je vois pas ce que tu veux dire
    le XmlSerializer s'en occupe, tu n'a rien a faire sinon
    ton xml est parsé directement et dans le xml il y a tout ce qu'il faut pour que le xml serializer sache quel objet instancier et tout et tout
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    ce que je veux dire, c'est que tu as :

    - la récupération des données de ton fichier XML
    - ton Observable Collection qui contient des données(on va dire un tableau)

    comment tu fais pour lier les 2 ???

    Pour moi, tu prends tes données de ton XML, elles sont dans 1 variable ou autres, et il te faut "ranger" cela dans ta collection(tableau).

    Dans ta collection tu as des "casiers" correspondants aux attributs de ton fichier XML

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    non non c'est le xmlserializer qui fait tout
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  16. #16
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Pour essayer d'expliquer l'exemple fourni par ikeas :
    Il part d'une classe Projet avec les attributs serialisable qui vont bien.
    Dans le save, il effectue une sérialisation xml de son/ses objets Projets et obtient donc un fichier xml.

    Dans le load, il effectue une dé-sérialisation de son fichier xml pour ré-obtenir sa classe Projet.

    Tu vas devoir essayer de générer ton objet (ta classe) à partir de ton fichier xml. Il existe peut être des outils pour ça...

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    merci je comprends un peu mieux, places aux tests maintenant...

    ikeas, oserais-je te demander un morceau de code de ta classe Projet ?? Ca m'intéresse surtout au niveau de la déclaration de ta collection.

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    dans la classe projet il n'y a pas de collection
    mais pour te simplifier la vie tu peux faire
    public class toto : Observablecollection<monobjet>
    {
    // ici tu me le load et le save
    // le seul truc a ajouter c'est dans le load, le deuxieme argument de xmlserializer
    // de mettre new XmlSerializer(typeof(toto),new Type[] { typeof(monobjet) }):
    }
    normalement ca devrait marcher au poil
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  19. #19
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Il faut penser à ajouter les attributs qui vont bien (tout du moins d'après mes souvenirs ) :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      [Serializable]
      public class Projet {
     
        public string Nom {
          get;
          set;
        }
     
      }

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      [Serializable]
      public class Projets : ObservableCollection<Projet> {
     
      }

    [Edit] http://msdn.microsoft.com/fr-fr/libr...hh(VS.80).aspx

  20. #20
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    pour le [Serializable] t'es pas oblige ca sert surtout pour les web services en general
    le seul probleme de la serialisation (en xml) ce sont les elements non serialisable directement comme les images, les couleurs etc ....
    mais il y'a des solution simple, comme serialiser en binaire, ou faire une serialisateur avec xmlignore et xmlelement
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2010, 16h28
  2. Probleme de binding avec une observableCollection
    Par Yogy dans le forum Silverlight
    Réponses: 4
    Dernier message: 10/06/2009, 17h50
  3. [ListView bindée avec un objet]
    Par jaujau dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 13/03/2008, 09h32
  4. [Listview] Ligne avec plusieurs couleurs
    Par Runlevel dans le forum C++Builder
    Réponses: 16
    Dernier message: 18/10/2006, 19h29
  5. [VB.NET] ListView Problème avec propriété View à 'List'
    Par elkidos dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/08/2006, 17h10

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