3

我正在尝试使用 MVVM 代码结构在 Windows Phone 8 上工作的地图叠加层。我似乎无法让 MapOverlay 的 GeoCoordinate 属性正确绑定到我的 ViewModel,我不知道为什么。

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 事件正在为我的模型触发,因为地图本身的中心正在更新,甚至尝试传递 null 来触发所有字段都无济于事。

我已经检查了调试并且 MapOverlay GeoCoordinate 的属性似乎总是​​为空。我尝试将以下内容添加到代码隐藏中,将圆圈放在我想要的位置,但我似乎无法根据事件发生它......

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

有谁知道为什么会这样或如何解决这个问题?我不想为此放弃 MVVM 架构。

4

2 回答 2

4

这是 Silverlight XAML 解析器的限制。作为 XAML 元素属性的一部分初始化的对象将不参与同一逻辑树,因此没有数据上下文深入其中。

为了对新的诺基亚地图控件进行数据绑定,请使用新的Windows Phone Toolkit中的 MapExtensions 。例如,这里是如何使用 MapExtensions 在特定地理坐标中创建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>
于 2012-11-17T10:52:25.500 回答
2

要解决此问题,您需要隐式告诉绑定在哪里找到属性,在 MVVM Light 世界中,它看起来像:

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

此外,您将需要 viewmodel 上的调度程序来处理 ui 更改

于 2013-01-08T07:33:21.753 回答