3

MVVMコード構造を使用して、WindowsPhone8でマップオーバーレイを機能させようとしています。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マップコントロールが期待するものに変更します。マップバインディングの中心は正常に機能していますが、オーバーレイのGeoCoordinateはバインドされず、青い円はマップの左上にあります。

デバッグとマップ自体の中心が更新されているため、モデルに対してPropertyChangedイベントが発生していることを確認しました。さらに、nullを渡して、すべてのフィールドを無効にトリガーしようとしました。

デバッグをチェックインしましたが、MapOverlayGeoCoordinateのプロパティは常にnullのようです。必要な場所に円を配置するコードビハインドに次のように追加しようとしましたが、イベントに基づいてそれを実現できないようです...

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

これがSilverlightXAMLパーサーの制限です。XAML要素のプロパティの一部として初期化されたオブジェクトは、同じ論理ツリーに参加しないため、データコンテキストをドリルダウンすることはありません。

新しいNokiaMapコントロールをデータバインドするには、新しいWindowsPhoneToolkitの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>
于 2012-11-17T10:52:25.500 に答える
2

これを修正するには、プロパティを見つける場所をバインディングに暗黙的に指示する必要があります。MVVMLightの世界では、次のようになります。

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

また、UIの変更を処理するには、ビューモデルにディスパッチャーが必要です。

于 2013-01-08T07:33:21.753 に答える