locked
Items / ItemsSource / Clear RRS feed

  • Question

  • Bonjour,

    Alors que le developpement touche bientôt a sa fin et je dois dire que pour une premiere application, je suis plutôt satisfait du resultat, je suis face a un probleme qui me bloque depuis les dernieres heures.

    Pour resumer le probleme :

    Je suis sur une page affichant une carte.

    J'affiche sur cette carte des pushpin grace a

    ObservableCollection<Villes> villes = new ObservableCollection<Villess>()

    Je charge donc toutes les villes avec les coordonnees, leur nom et leur adresse.

    Je stock ensuite le tout de la sorte :

    ObservableCollection<DependencyObject> children = MapExtensions.GetChildren(Map);

    varobj = children.FirstOrDefault(x => x.GetType() == typeof(MapItemsControl)) asMapItemsControl;

    obj.ItemsSource = villes;

    Et tout se passe tres bien. Les villes s'affichent bien, bref, pas de probleme.

    Lorsque je clique sur un pushpin, je veux afficher les informations adresse, nom et coordonnees ainsi que d'autres informations.

    Je recupere donc les donnees déjà connues et je place le tout dans une variable globale de type structure, je lance ma nouvelle page et j'affiche les donnees. Tout se passe bien ... Par contre, lorsque je fais retour, rien ne va plus...

    J'ai une exception et on me dit que items must be empty before using itemsSource...

    Et je suis bloque la ...

    A savoir que l'affichage de pushpin est contenu dans la fonction Loaded_Cartes.


    • Modifié HaaSarD lundi 1 avril 2013 13:31
    lundi 1 avril 2013 13:30

Réponses

  • Explication : MapItemsControl a un gros bug, il crash quand on l'affecte une seconde fois.

    Or tu l'affectes dans l'event Loaded, appelé à chaque "affichage" de la page, or dans quand tu charges la page, tu l'appelles une première fois, puis tu navigues, tu fais back, ce qui réaffiche la page et donc reaffecte le ItemsSource de MapItemsControl => 2 appels => crash

    Pour corriger cela, il faut que tu te désabonnes de Loaded une fois passé dedans ou encore il faut que tu testes si Items est vide ou pas :

    if(obj.ItemsSource==null)

    Ainsi, on est sur d'affecter qu'une seule fois

    void Cartes_Loaded(objectsender, RoutedEventArgse)
            {  
    
    var obj = children.FirstOrDefault(x => x.GetType() == typeof(MapItemsControl)) asMapItemsControl;
    if(obj.ItemsSource==null)
    {
    
    ObservableCollection<Villes> villes = newObservableCollection<Villes>()
                {
    new Villes{ Coordinate = newGeoCoordinate(blablablabla)
         };
    ObservableCollection<DependencyObject> children = MapExtensions.GetChildren(Map);
     
                obj.ItemsSource = villes;
            }
    }


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    • Marqué comme réponse HaaSarD jeudi 4 avril 2013 13:26
    jeudi 4 avril 2013 13:15

Toutes les réponses

  • es tu sûr que tu n'as pas de référence vers Items ?

    A mon avis tu as laissé quelque part un système de tombstoning qui essaie de réaffecter Items


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    mardi 2 avril 2013 12:04
  • problème reproduit : utilise une ObservableCollection plutôt, il est impossible d'affecter deux fois la propriété ItemsSource d'un MapItemsControl (bug)

    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    mardi 2 avril 2013 22:02
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 3 avril 2013 11:59
  • J'avoue que je suis un peu perdu la ...

    J'ai bien l'impression d'utiliser une ObservableCollection... voila une partie de mon code :

           

    voidCartes_Loaded(objectsender, RoutedEventArgse)

            {  

    ObservableCollection<Villes> villes = newObservableCollection<Villes>()

                {

    new Villes{ Coordinate = newGeoCoordinate(blablablabla)

         };

    ObservableCollection<DependencyObject> children = MapExtensions.GetChildren(Map);

    var obj = children.FirstOrDefault(x => x.GetType() == typeof(MapItemsControl)) asMapItemsControl

                obj.ItemsSource = villes;

            }



    Et je load cartes_loaded dans cette page Cartes.

    Ensuite, j'appuie sur un pushpin, je charge les infos de la ville concernee dans des variables globales et je lance la nouvelle page Ville qui me montre ces infos, et a l'appuie sur le bouton retour, plantage.

    • Modifié HaaSarD mercredi 3 avril 2013 12:24
    mercredi 3 avril 2013 12:20
  • Puis-je vous envoyer le projet par message prive ?
    jeudi 4 avril 2013 13:05
  • Explication : MapItemsControl a un gros bug, il crash quand on l'affecte une seconde fois.

    Or tu l'affectes dans l'event Loaded, appelé à chaque "affichage" de la page, or dans quand tu charges la page, tu l'appelles une première fois, puis tu navigues, tu fais back, ce qui réaffiche la page et donc reaffecte le ItemsSource de MapItemsControl => 2 appels => crash

    Pour corriger cela, il faut que tu te désabonnes de Loaded une fois passé dedans ou encore il faut que tu testes si Items est vide ou pas :

    if(obj.ItemsSource==null)

    Ainsi, on est sur d'affecter qu'une seule fois

    void Cartes_Loaded(objectsender, RoutedEventArgse)
            {  
    
    var obj = children.FirstOrDefault(x => x.GetType() == typeof(MapItemsControl)) asMapItemsControl;
    if(obj.ItemsSource==null)
    {
    
    ObservableCollection<Villes> villes = newObservableCollection<Villes>()
                {
    new Villes{ Coordinate = newGeoCoordinate(blablablabla)
         };
    ObservableCollection<DependencyObject> children = MapExtensions.GetChildren(Map);
     
                obj.ItemsSource = villes;
            }
    }


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    • Marqué comme réponse HaaSarD jeudi 4 avril 2013 13:26
    jeudi 4 avril 2013 13:15
  • Merci enormement, je vais essayer cela de suite.

    J'ai tout de meme une question avant de tester, pourquoi aucune erreur se produit lorsque j'affiche ma carte, je fais back, je navigue et je retourne sur ma carte ?

    Je lance aussi 2 fois ma carte non ?

    • Proposé comme réponse Mafyou dimanche 7 avril 2013 10:56
    • Non proposé comme réponse Mafyou dimanche 7 avril 2013 10:56
    jeudi 4 avril 2013 13:20
  • Tout marche très bien, problème réglé !

    Merci encore pour l'aide, j'ai utilisé la solution du if qui était pour moi la plus facile a comprendre et a mettre en œuvre.

    Si vous avez un peu de temps, est-ce que vous pouvez tout de même répondre a ma question au dessus ?

    Je marque comme réponse !

    L'application est finie, je vais essayer de la publier :)

    jeudi 4 avril 2013 13:26
  • Je pense que les items de la carte on eu le temps de se faire garbage collecter!
    dimanche 7 avril 2013 10:57
  • Pour répondre à ta dernière question,

    Il se peut que la méthode appelée (ici, Cartes_Loaded, je suppose) pour la mise à jour est utilisé deux fois (dans la classe cs et dans xaml). Tu peux alors supprimer la méthode de xaml (cela est répétitif).

    (J'ai eu le même problème que toi et je viens de trouver la cause).

    J'espère que cela corrigerait également ton problème.

    F2O 

    lundi 15 avril 2013 13:49