地图覆盖物绑定不起作用。

3
我将尝试在Windows Phone 8上使用MVVM代码结构实现地图叠加层。我似乎无法正常将MapOverlay的GeoCoordinate属性绑定到我的ViewModel,并且无法弄清楚原因。
当前的XAML如下:
Header:
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。地图绑定的中心工作正常,但叠加层上的GeoCoordinate不会绑定,蓝色圆圈只会停留在地图的左上方。
我已经验证了PropertyChanged事件对于我的模型来说是有效的,通过调试和因为地图本身的中心正在更新,甚至尝试传递null来触发所有字段,但都没有成功。
我已经在调试中检查了MapOverlay GeoCoordinate属性,它似乎总是为空。我尝试在代码后面添加以下内容,可以将圆圈放在我想要的位置,但我似乎无法根据事件让它发生...
GpsCoordinateConverter converter = new GpsCoordinateConverter();
Map.Layers[0][0].GeoCoordinate = (GeoCoordinate)converter.Convert(((ViewModel.ReportViewModel)DataContext).MapCenter, typeof(GeoCoordinate), null, null);

有人知道为什么会出现这种情况或者如何解决吗?我不想为此放弃MVVM架构。

2个回答

4
这是Silverlight XAML解析器的限制。作为XAML元素属性的一部分初始化的对象将不参与同一逻辑树,因此不能在其中进行数据上下文钻取。
为了数据绑定新的Nokia地图控件,请使用新的Windows Phone Toolkit中的MapExtensions。例如,这里是如何使用MapExtensions创建特定GeoCoordinate中的PushPin的方法
<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>

令人印象深刻的烦人之处是,必须下载扩展框架来支持仅有几周历史的SDK上的基本功能,但至少它能够工作。干杯。 - fyjham
这会对我的问题有所帮助吗?https://dev59.com/nmvXa4cB1Zd3GeqPJXdq - MLProgrammer-CiM
据我所知,该工具包没有MapPolylines的扩展。另外,请查看您问题中的我的答案。 - user8709

2
为了修复这个问题,您需要明确告诉绑定程序在哪里找到属性。在MVVM Light世界中,它会像这样:
    <maps:MapOverlay GeoCoordinate="{Binding Main.CurrentLocation, Source={StaticResource Locator}}">
                            <Ellipse Fill="Blue" Height="20" Width="20" Opacity="50" />
                        </maps:MapOverlay>

同时,您需要在ViewModel上使用Dispatcher来处理UI更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接