Un pequeño bug en los bindings de Bing Maps para Windows Phone 7, y cómo solucionarlo
El control de Bing Maps para Windows Phone 7 permite hacer bindings de elementos tales como el centro y el nivel de zoom (Center y ZoomLevel).
<maps:Map HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Center="{Binding CentroMapa, Converter={StaticResource llconverter}, Mode=TwoWay}" ZoomLevel="{Binding Zoom, Mode=TwoWay}" Grid.Row="0" x:Name="Mapa" MapPan="MapPan" MouseLeftButtonUp="Map_MouseUp" Hold="Map_Hold" />
Esto funciona bastante bien, pero ocasionalmente ocurre un problema de performance al entrar y salir de la página que contiene el control. Esto se manifiesta al hacer panning sobre el mapa, se siente como que tuviera un elástico y tiende a volver a la posición original (antes de hacer el panning). Al parecer esto pasa al hacer bindings en modo TwoWay.
Una forma de solucionarlo es quitando los bindings para Center y ZoomLevel en el XAML, y hacerlos en Code Behind, añadiendo y quitando los bindings en los eventos Loaded y Unloaded del control.
public MapPage() { InitializeComponent(); Mapa.Loaded += Mapa_Loaded; Mapa.Unloaded += (sender, args) => { Mapa.ClearValue(Map.CenterProperty); Mapa.ClearValue(Map.ZoomLevelProperty); } } private void Mapa_Loaded(object sender, RoutedEventArgs e) { var centro = new Binding("CentroMapa"); var zoom = new Binding("Zoom"); centro.Source = App.ViewModel; centro.Mode = BindingMode.TwoWay; centro.Converter = new LatLngGeoCoordConverter(); zoom.Source = App.ViewModel; zoom.Mode = BindingMode.TwoWay; Mapa.SetBinding(Map.CenterProperty, centro); Mapa.SetBinding(Map.ZoomLevelProperty, zoom); }
De esta forma la página que contiene el mapa ya no manifestará más el comportamiento extraño al hacer panning. Este problema no existe en el control de Windows Phone 8.