[WP8] Binder une collection sur une Map !

mar 19, 2013 11:07 am by Julien

EDIT : Après mon post, notre cher Rudy National, nous a aussi proposé sa solution disponible a cette adresse : http://www.rudyhuyn.com/blog/2013/03/19/wp8-binder-une-collection-sur-une-map-2-le-retour/

 

Avec WP8, les services cartographiques ont changés, mais les controles également ! Avec WP8 nous avons accés a un Map Control qui nous permet d'afficher une carte dans notre application !
On peut également rajouter des couches mais il est au final plus compliqués de gerer des Pushpin sur carte !

Et le toolkit nous sauva ...

Mais grâce au toolkit, nous a vons a disposition des extensions pour gerer les pushpin !

On peut gerer facielment l'ajout de pushpin grace au control Pushpin

Ajouter notre position courante grace au controle UserLocationMarker

Avoir une collection de pushpin !

Mais :|

Si on regarde le code du MapItemsControl on remarque qu'il derive de DependencyObject et pas de FrameworkElement, du coup le probleme qui se pose c'est qu'en cas de binding, le datacontext n'est pas propagé au MapItemsControl !

J'ai donc fait un petit behavior qui permet de gerer cela ! 

public class MapItemCollectionBehavior : Behavior<Map>
    {
        public IEnumerable<object> ItemsSource
        {
            get { return (IEnumerable<object>)GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ItemSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register("ItemsSource", typeof(IEnumerable<object>), typeof(MapItemCollectionBehavior), new PropertyMetadata(OnSourceChanged));

      private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {

            var map = ((MapItemCollectionBehavior) d).AssociatedObject;
            MapItemsControl mapItemsControl = MapExtensions.GetChildren(map).OfType<MapItemsControl>().FirstOrDefault();
            if (mapItemsControl != null)
            {
                mapItemsControl.ItemsSource = ((MapItemCollectionBehavior) d).ItemsSource;
            }
        }
    }

Pour l'utiliser rien de plus simple :

<maps:Map HorizontalAlignment="Stretch" ZoomLevel="15">
                <i:Interaction.Behaviors>
                    <behaviors:MapItemCollectionBehavior ItemsSource="{Binding MyCollection}">
                    </behaviors:MapItemCollectionBehavior>
                </i:Interaction.Behaviors>
                <toolkit:MapExtensions.Children>
                    <toolkit:MapItemsControl>
                        <toolkit:MapItemsControl.ItemTemplate>
                            <DataTemplate>
                                <toolkit:Pushpin>
                                </toolkit:Pushpin>
                            </DataTemplate>
                        </toolkit:MapItemsControl.ItemTemplate>
                    </toolkit:MapItemsControl>
                </toolkit:MapExtensions.Children>
</maps:Map>

Voilou :)

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading