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.


