MapOverlay绑定不工作(MapOverlay binding not working)

2019-07-03 21:05发布

我试图让一个地图叠加在Windows Phone 8个工作使用MVVM代码结构。 我似乎无法得到MapOverlay的会有地理座标属性绑定到我的视图模型正确,我不能明白为什么。

作为支架的XAML是:

标题:

xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"

码:

<maps:Map x:Name="Map"  ZoomLevel="6" Height="500" Width="500" CartographicMode="Terrain" Center="{Binding MapCenter, Converter={StaticResource GpsCoordinateConverter}, Mode=TwoWay}">
    <maps:Map.Layers>
        <maps:MapLayer>
            <maps:MapOverlay PositionOrigin="1,1"  GeoCoordinate="{Binding MapCenter, Converter={StaticResource GpsCoordinateConverter}, Mode=OneWay}">
                <Ellipse Fill="Blue" Height="20" Width="20" Opacity="50" />
            </maps:MapOverlay>
        </maps:MapLayer>
    </maps:Map.Layers>
</maps:Map>

GpsCoordinateConverter只是一个很简单的类,它改变从我的视图模型为数据类型System.Device.Location.GeoCoordinate ,地图控制预期。 在地图的中间装订工作正常,但在覆盖会有地理座标将不能结合和蓝色圆圈只是坐在在地图的左上角。

我已经验证PropertyChanged事件被解雇了我的模型中,通过调试和因为地图的中心本身正在更新,甚至试图通过零触发无济于事各个领域。

我在调试检查,并为MapOverlay会有地理座标属性似乎总是​​空。 我试着加入以下代码隐藏这使我想要它了一圈,但我似乎无法得到基于事件这样的情况发生?

GpsCoordinateConverter converter = new GpsCoordinateConverter();
Map.Layers[0][0].GeoCoordinate = (GeoCoordinate)converter.Convert(((ViewModel.ReportViewModel)DataContext).MapCenter, typeof(GeoCoordinate), null, null);

没有人知道为什么会或如何解决这一问题? 我不想放弃MVVM架构这一点。

Answer 1:

这就是Silverlight的XAML分析器的限制。 对象初始化为XAML元素的属性的一部分,将不参加在同一逻辑树,因此不具有的DataContext向下钻取到他们。

为了数据绑定新的诺基亚地图控件,使用来自新MapExtensions 的Windows Phone工具包 。 例如,以下是如何创建一个特定会有地理座标图钉使用MapExtensions。

<maps:Map x:Name="Map" Grid.Row="1" Hold="OnMapHold">
    <maptk:MapExtensions.Children>
        <maptk:Pushpin x:Name="RouteDirectionsPushPin" Visibility="Collapsed"/>
        <maptk:MapItemsControl Name="StoresMapItemsControl">
            <maptk:MapItemsControl.ItemTemplate>
                <DataTemplate>
                    <maptk:Pushpin GeoCoordinate="{Binding GeoCoordinate}" Visibility="{Binding Visibility}" Content="{Binding Address}"/>
                </DataTemplate>
            </maptk:MapItemsControl.ItemTemplate>
        </maptk:MapItemsControl>
        <maptk:UserLocationMarker x:Name="UserLocationMarker" Visibility="Collapsed"/>
    </maptk:MapExtensions.Children>
</maps:Map>


Answer 2:

为了解决这个问题,你需要含蓄地告诉你的绑定在哪里可以找到的财产​​,在MVVM光世界,将是这样的:

    <maps:MapOverlay GeoCoordinate="{Binding Main.CurrentLocation, Source={StaticResource Locator}}">
                            <Ellipse Fill="Blue" Height="20" Width="20" Opacity="50" />
                        </maps:MapOverlay>

同时,你需要在视图模型的调度处理的UI变化



文章来源: MapOverlay binding not working