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 Phone .NET Discussion :

Comprendre l'Observable Collection [Windows Phone 8]


Sujet :

Windows Phone .NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Comprendre l'Observable Collection
    Bonjour à tous.
    Débutant sur le développement Windows Phone je me tourne vers la communauté afin d'avoir de plus amples renseignement sur l'utilisation des listes Observable.
    En lisant plusieurs articles sur le net et quelques ouvrages, j'ai pu programmer un petit exemple sur l'utilisation de l'Observable Collection. A savoir une longListSelector bindée sur une liste. Puis un bouton ajout et suppression d'éléments de la liste. Lors de l'appui sur ces boutons ma liste s'actualise en temps réel et les modifications apparaissent bien sur l'écran. Donc pas de soucis.
    Aujourd'hui je développe une application basée sur ce principe et mon soucis vient que l'ajout ou la suppression d'éléments s'effectue à partir d'une autre page et là cela ne fonctionne plus. Un élément doit m'échapper mais je piétine.
    En fait pour que cela fonctionne j'enregistre ma liste dans l'isolated storage, puis je charge le fichier dans la page "ajout", je le modifie puis j'enregistre le fichier modifié dans l'isolated Storage. Ensuite retour à la page principale avec lecture du fichier, ce qui actualise (bien sûr) ma liste.
    J'aimerais donc savoir comment modifier ma liste depuis une autre page et faire en sorte que la modification soit effective en revenant en arrière. Pour être plus clair, je souhaite obtenir le même effet que l'application native "Contact" sur Windows Phone. L'ajout d'un contact se fait sur une autre page et lorsqu'on revient en arrière la modification est prise en compte.
    En vous remerciant par avance de votre aide.
    Cordialement
    AF1962

  2. #2
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Hello,

    Je vois deux solutions (Il y en a certainement beaucoup d'autres):

    - Basculer en MVVM avec MvvmLight par exemple ce qui te permettra d'agir entre les différents ViewModel.
    - Regarder comment passer des arguments d'une page à l'autre via le NavigationService

    A+
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bonjour DotNet74
    Merci pour la réponse.
    En ce qui concerne la MVVM je manque de connaissance sur le sujet l'appliquer correctement, je pense y venir prochainement. Par contre tu m'as donné un début d'idée avec la NavigationService.
    Je vais essayer cela dés que possible et je posterais une réponse après.
    Merci encore.
    A+

  4. #4
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Après,

    si tu débutes, fait l'effort de passer directement sur MVVM tu gagneras du temps après
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bonjour DontNet74
    J'ai suivi ton idée de base et je l'ai adaptée à l'IsolatedStorage plutôt que la NavigationService. Effectivement cela permet d'avoir la listeBox rafraichie sans avoir à recharger le fichier modifié comme je le faisais jusqu'alors.
    Cela fonctionne mais avec un petit bémol. Ma liste est affichée par ordre alphabétique suivant le code :
    listBox.Itemsource = fichier.Orderby(t => t.Nom);

    Si je supprime le tri, la liste est actualisée mais les éléments apparaissent à mesure qu'ils sont entrés (normal).
    Par contre avec le code de triage la liste n'est plus actualisée.

    Pour ce qui est de ton conseil sur la MVVM il est certain que je vais y venir d'ici peu. Dés que j'aurai terminé l'application que je développe depuis plusieurs mois et dés que j'aurai récupéré la version Pro de Windows 10.

    Merci encore c'est très sympa de ta part de m'avoir aidé.

  6. #6
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Il faudrait un peu plus de code pour pouvoir essayer de t'aider ...
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Ok
    Voici un fichier avec un exemple très simple qui ajoute un élément (le même) à une liste en appuyant sur un bouton. Puis à partir de cet exemple comment modifier ma collection de la même manière mais à partir d'une autre page et retrouver ensuite ma liste actualisée en revenant sur la page précédente.
    En fait comme je l'ai déjà écrit je souhaite obtenir le même résultat que l'application native "contact" du Windows phone.
    Cordialement.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Bon,

    vu que tu ne veux pas passer par MVVM tout de suite je te suggère de mettre ton ObservableCollection au niveau du App.cs ce qui te permettra de l'atteindre de partout:

    Dans la App.xaml.cs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
    public static ObservableCollection<Contacts> pers {get;set;}
    ...
    public App()
    {
      Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync(
      Microsoft.ApplicationInsights.WindowsCollectors.Metadata |
      Microsoft.ApplicationInsights.WindowsCollectors.Session);
      this.InitializeComponent();
      this.Suspending += OnSuspending;
     
      pers = new ObservableCollection<Contacts>();
    }
    ...
    Après depuis n'importe quel page de ton application tu peux faire le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    App.Current.pers.Add();
    ...
    Ce qui fait que depuis ta page d'ajout d'un contact tu auras le code ci-dessus et dans la page principale il faut détecter le moment ou tu reviens sur la page.

    Je crois que c'est OnNavigatedTo(...) que tu vas modifier par un override pour pouvoir mettre à jour ta liste dans la page principale comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
      base.OnNavigatedTo(e);
      Maliste.Itemssource = App.Current.pers.OrderBy(t => t.Nom).ToList();
    }
    ...
    Du coup le chargement de la liste des contacts aura lieu à chaque retour sur la page principale.

    Je n'ai pas testé donc je te laisse voir si cela fonctionne

    A+
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Salut
    Je n'ai pas réussi à utiliser le code que tu m'as donné, il n'est pas reconnu. Toutefois j'ai abordé le problème différemment. Ce que je fais à présent c'est de recharger mon fichier seulement si celui ci est modifié. Comme il s'agit d'une gestion de contact, ce n'est pas quelque chose que l'on modifie tous les jours (enfin en ce qui me concerne). Ce n'est pas tout à fait ce que je souhaitais faire mais dans l'utilisation de mon application cela ne pose pas vraiment de problème.
    Je crois pour finir, que si je souhaite le même effet que l'application native "contact" il faut que je passe par la MVVM. Chose que je vais commencer à étudier dans le cadre d'une deuxième application.
    Cela dit je te remercie de ton aide.

  10. #10
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    C'est quoi qui n'est pas reconnu ?
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  11. #11
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Le code suivant n'est pas reconnu dans App.cs

    Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync( Microsoft.ApplicationInsights.WindowsCollectors.Metadata |
    Microsoft.ApplicationInsights.WindowsCollectors.Session);

    D'ordinaire, l'intellisense laisse appraître un using, mais pas dans ce cas.

  12. #12
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    ah ok,

    tu peux enlever ces 3 lignes ...

    c'est pour autre chose et provient du fait que je suis sous une solution UWP ...
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  13. #13
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Salut DotNet74
    Désolé de la réponse tardive.
    Encore merci pour ton aide en effet en plaçant l'observable collection dans l'App l'accès se fait depuis n'importe qu'elle page sans avoir à recharger le fichier et le retour à la page précédente affiche aussi les modifications.
    Exactement ce que je cherchais.
    Toutefois connais-tu une méthode de tri car cela ne fonctionne pas avec si j'utilise Orderby: tel que listBox.Itemsource = fichier.Orderby(t => t.Nom);
    Orderby empêche l'affichage en temps réel.
    Cordialement

  14. #14
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Hello,

    comme ça je ne vois pas ...

    As tu essayé de faire un Clear avant de faire le tri ?
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    C'est normal que l'Orderby empêche l'affichage "temps-réel".
    La fonction ToList() te retourne une IList.
    L'ObservableCollection possède une mécanisme interne qui notifie ton composant MaListe d'un changement.

    Le code ,ci-dessous, corrige ton problème d'affichage "temps réel" et de tri.
    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
     
            public MainPage()
            {
                InitializeComponent();
                Maliste.ItemsSource = pers;
            }
     
    private void button_AjouterClick(object sender, RoutedEventArgs e)
            {
                //Creation d'une liste temporaire
                IList<Contacts> temp = pers.ToList();
                Contacts contact = new Contacts("Depuis la page principal");
                temp.Add(contact);
     
                //Tri sur la liste temporaire
                IOrderedEnumerable<Contacts> orderedTemp = temp.OrderBy(c => c.Nom);
                //Récupération de l'index du contact ajouté
                long index = orderedTemp.LongCount(c => c == contact);
     
                //Insertion ou Ajout du contact dans l'Oberservable Collection
                if (index > 0)
                {
                    int persIndex = (int)(index -1);
                    pers.Insert(persIndex, contact);
                }
                else
                {
                    pers.Add(contact);
                }
            }

  16. #16
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bonsoir thedarkneo60
    Merci pour ton aide.
    Ton code ne donne rien de plus ou alors quelque chose m'échappe. Tout ce que j'obtiens c'est l'insertion d'un élément et non l'ajout. Peut importe j'en conviens mais les éléments s'insèrent les uns après les autres sans tri.
    En relisant ton post, je me demande si je n'ai pas pris le problème à l'envers. Ce que je souhaite depuis le début c'est actualiser ma liste en temps réel en ayant les éléments triés. En fait ce qu'il faut faire c'est insérer un nouvel élément dans la liste au bon endroit alphabétique. Il faudrait pour cela connaître Id de l'élément avant ou après.
    Cordialement.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Points : 28
    Points
    28
    Par défaut
    Le code ne fonctionnait pas car j'ai confondu la fonction LongCount() avec la fonction IndexOf()

    Voici la version corrigée:

    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
    public MainPage()
            {
                InitializeComponent();
                Maliste.ItemsSource = pers;
            }
     
    private void button_AjouterClick(object sender, RoutedEventArgs e)
            {
                //Creation d'une liste temporaire
                IList<Contacts> temp = pers.ToList();
                Contacts contact = new Contacts("Depuis la page principal");
                temp.Add(contact);
     
                //Tri sur la liste temporaire
                IOrderedEnumerable<Contacts> orderedTemp = temp.OrderBy(c => c.Nom);
                //Récupération de l'index du contact ajouté
                int index = orderedTemp.ToList().IndexOf(contact);
     
                //Insertion ou Ajout du contact dans l'Oberservable Collection
                if (index >= 0 && index < pers.Count )
                {
                    pers.Insert(index, contact);
                }
                else
                {
                    pers.Add(contact);
                }
            }

  18. #18
    Membre à l'essai
    Homme Profil pro
    Ingénieur technique
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur technique

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut [RESOLU]
    Bingo !!!!!
    Cela fonctionne parfaitement. Je réalise la stupidité de mon dernier post, ton code fait ce que j'ai écrit. Désolé je commence la programmation alors parfois je percute avec une certaine latence.
    Je passe le post en RESOLU.
    Merci encore pour ta solution.

  19. #19
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Et bien tun peux appuyer sur la petite main verte sur la solution qu'il t'a donné et qui t'a aidé ...
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

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

Discussions similaires

  1. [Débutant] Problématique pour le binding des éléments d'une Observable Collection
    Par mrflamby dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 07/09/2015, 13h12
  2. Réponses: 7
    Dernier message: 17/04/2014, 09h31
  3. Observable Collection - Data Binding
    Par quentin869 dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 15/02/2014, 12h44
  4. Linq, est-il possible de filtrer une observable collection ?
    Par Golzinne dans le forum Silverlight
    Réponses: 2
    Dernier message: 14/11/2011, 20h31
  5. Refresh WPF Observable Collection
    Par MathieuMN dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 28/10/2011, 18h45

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