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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    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 Expert
    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
    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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    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 Expert
    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
    Par défaut
    je dirais meme plus : poils au nez !!!!!

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

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    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 Expert
    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
    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();
            }

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

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

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