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.

Agregar un comentario