[WP8] Binder une collection sur une Map ! 2 le retour

[WP8] Binder une collection sur une Map ! 2 le retour

Cet article fait suite non pas à un de mes articles mais à un article d’un copain Julien Lo Presti :  MSP, expert Windows Phone et breton, trois bons points ! (et accessoirement un bon copain et partenaire de hackathon). Il a notamment développé l’application Stinson Book

Sur son blog Julien propose une solution à un problème assez gênant : l’impossibilité de binder avec un MapItemsControl du toolkit. Pour parer à cela, Julien proposer une solution astucieuse avec un Behavior : classe !

Lire son article ici :

http://jlopresti.fr/post/2013/03/19/WP8-Binder-une-collection-sur-une-Map-!

Untitled-1

 

Entre bretons, on aime se chamailler, on considère que cela nous fait progresser et il se trouve que pour Wikipedia WP8 (qui va bientôt arriver dès que je trouverais quelques heures) j’avais rencontré la même problématique et j’avais contourné cette problématique non pas un behavior mais une propriété d’extensions.

Ma solution

    public class MapTools : DependencyObject
    {
        [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "Standard pattern.")]
        public static bool GetMapItemsSource(DependencyObject source)
        {
            return (bool)source.GetValue(MapItemsSourceProperty);
        }


        [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "Standard pattern.")]
        public static void SetMapItemsSource(DependencyObject source, IEnumerable value)
        {
            source.SetValue(MapItemsSourceProperty, value);
        }

        // Using a DependencyProperty as the backing store for MapItemsSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MapItemsSourceProperty =
            DependencyProperty.Register("MapItemsSource", typeof(IEnumerable), typeof(Map), new PropertyMetadata(null, MapItemsSourceChanged));

        private static void MapItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var map = ((Map)sender);
            var itemsControl = MapExtensions.GetChildren(map).OfType<mapItemsControl>().FirstOrDefault();
            if (itemsControl != null)
            {
                itemsControl.ItemsSource = (IEnumerable)e.NewValue;
            }
        }
    }

et pour l’utiliser :


<maps:Map x:Name="Map" huynmap:MapTools.MapItemsSource="{Binding MyPlaces}" HorizontalAlignment="Stretch" ZoomLevel="15">
<toolkit:MapExtensions.Children>
<toolkit:MapItemsControl >
<toolkit:MapItemsControl.ItemTemplate>
<DataTemplate>
<toolkit:Pushpin .../>
</DataTemplate>
</toolkit:MapItemsControl.ItemTemplate>
</toolkit:MapItemsControl>
</toolkit:MapExtensions.Children>
</maps:Map>

Conclusion

Les deux solutions sont au final équivalente et utilisent les mêmes principes : se brancher au FrameworkElement Map, qui est le dernier élément à avoir accès au DataContext et gérer le MapItemsControl depuis ce point.

La différence est surtout que le Behavior est plus facilement exploitable sous Blend en WYSIWYG alors que la propriété d’extension elle à l’avantage de ne pas tirer des dépendances de librairies liées à Blend. On pourra toutefois espérer avec de meilleur performance au chargement pour la propriété d’extension (pas de dll à charger, moins complexe).

 

Merci Likeman

 

Comments are closed.