2010-11-18 8 views
3

J'utilise le contrôle Bing Maps pour afficher une série de punaises personnalisées, représentant des objets qui se déplacent constamment et changent d'état. En utilisant la liaison de données, les différentes propriétés des objets sont mises à jour comme elles le devraient, mais pour une raison quelconque, cela ne s'applique pas à leurs emplacements.Bing Maps - Mise à jour automatique de l'emplacement des punaises

J'ai la carte lié à un ObservableCollection comme tel:

<UserControl.Resources>  
    <DataTemplate x:Key="PushpinTemplate"> 
     <v:CustomPushpin /> 
    </DataTemplate> 
</UserControl.Resources> 

...

<m:Map Name="map"> 
    <m:MapItemsControl ItemTemplate="{StaticResource PushpinTemplate}" ItemsSource="{Binding Objects}" /> 
</m:Map> 

... et CustomPushpin:

<UserControl 
...  
    m:MapLayer.Position="{Binding Location}" m:MapLayer.PositionOrigin="BottomCenter" 
    mc:Ignorable="d" d:DesignHeight="126" d:DesignWidth="85"> 

Comme toutes les autres propriétés , l'emplacement des objets individuels est implémenté en utilisant INotifyPropertyChanged. Lorsque la carte est en mouvement, que ce soit en raison d'un panoramique ou d'un zoom, les objets se déplacent, mais n'indiquent pas d'autres.

Je n'arrive pas à comprendre si je fais quelque chose de mal ici, ou si c'est un problème avec le contrôle Bing Maps.

Une idée?

+0

J'ai eu le même problème :(Une idée de ce qui pourrait éventuellement être faux, là-bas? – themarcuz

Répondre

0

J'ai trouvé quelque chose here: il semble y avoir un bug dans le contrôle de Bing de Microsoft. J'ai même essayé la solution proposée, mais il ne fonctionne pas pour moi

+0

Oui, j'ai envisagé de changer la vue, mais pas exactement de cette manière, mais je ne l'ai jamais Essayé. Ce que j'ai fini par faire était "simplement" d'enlever et de rajouter la couche avec les broches. Je sais que cela ressemble à une opération très lourde, mais à en juger par le résultat, il ne semble pas être? – abp

+0

Au lieu de cela, j'ai simplement essayé de retirer l'ancienne punaise et de recréer une nouvelle punaise avec la nouvelle position. Je ne sais pas quelle opération est la plus lourde ... – themarcuz

+0

Ou mieux, je supprime la punaise de la collection, change l'emplacement, et réinsère la punaise mise à jour: la collection est observable, donc l'interface utilisateur intercepte ce changement et se met à jour En conséquence, je ne sais pas quelle opération est la plus lourde ... – themarcuz

0

Au cas où quelqu'un se demande, ma solution était de créer ma propre classe ObjectCollection et hériter de ObservableCollection<Object>. Ajouter un ObjectCollection.Refresh() méthode comme ceci:

public void Refresh() 
{ 
    base.OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset)); 
} 

et appeler cette méthode après que je suis fait repeupler la collection dans une boucle.

1

vue rafraîchissant par

map.SetView(map.BoundingRectangle); 

fonctionne

1

vue Rafraîchissant ne fonctionne pas pour moi. Au lieu de recréer Punaise, la solution la plus simple était:

_pushPin.Location = null; 
_pushPin.Location = _location; 

ou

_pushPin.Location = new Location(_location); 

Hope this helps.

1

J'ai trouvé une solution de contournement par Candritzky ici: Solution link with code

Fondamentalement, vous aurez à changer le ItemsPanel une personnalisé qui exposent de nouveaux AttachedProperty.Pour moi, cela fonctionne :)

2

Ne pas mettre à jour l'emplacement, comme ceci:

_pushPin.Location.Latitude = xyz... 

au lieu de créer un nouvel objet:

_pushPin.Location = new Location(_location); 

autrement BingMap va en quelque sorte perdre de vue la mise à jour par la suite