2

ビューモデルのバインドプロパティ「PushPinLocation」を使用してバインドするすべての画鋲を表示する必要がある mvvm モデルベースのアプリに次のビューがあります。

<MapNS:Map 
    Center="{Binding MapCenter, Mode=TwoWay}" Margin="0,0,-5,0" 
    CartographicMode="{Binding MapMode, Mode=TwoWay}" 
    LandmarksEnabled="True" PedestrianFeaturesEnabled="True"  
    ZoomLevel="{Binding MapZoomLevel, Mode=TwoWay}" 
    Foreground="AliceBlue" Grid.Row="1" Height="713"  Width="425" 
    x:Name="mapPanoramaAddress"  >

    <!--Adding Location to show map initially until the data arrived-->
    <maptk:MapExtensions.Children>

        <maptk:MapItemsControl Name="StoresMapItemsControl" >
            <maptk:MapItemsControl.ItemTemplate>
                <DataTemplate>
                     <maptk:Pushpin x:Name="PushPins" Background="White" 
                        GeoCoordinate="{Binding PushPinLocation}" 
                        Content="{Binding PushPinDisplayText}" 
                        Visibility="Visible" />
                </DataTemplate>
            </maptk:MapItemsControl.ItemTemplate>
        </maptk:MapItemsControl>                                
        <maptk:UserLocationMarker GeoCoordinate="{Binding PushPinLocation}" x:Name="UserLocationMarker" Visibility="Visible" />

    </maptk:MapExtensions.Children>

</MapNS:Map>

数メートルごとにトリガーされる geolocator positionchanged イベントで、画鋲と位置マーカーに共通するバインディング プロパティ "PushPinLocation" (ビュー モデルから) の値を設定しています。

//PushPinLocation
private GeoCoordinate _PushPinLocation = new GeoCoordinate(40.712923, -74.013292);    //cannot assign null 
public GeoCoordinate PushPinLocation
{
    get { return _PushPinLocation; }
    set
    {
        if (_PushPinLocation != value)
        {
            _PushPinLocation = value;
            RaisePropertyChanged("PushPinLocation");
        }
    }
}

同じviewmodel geolocator_Position変更イベントで、プッシュピンの場所を設定しています:

private void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    this.PushPinLocation = args.Position.Coordinate.ToGeoCoordinate();
}

しかし、最新のものは常に表示され、古いものはマップに表示されません。古いものも保持する方法はありますか?

4

1 に答える 1

2

この投稿は 1 年前のものですが、回答がないため、ここに私の回答を示します。

単一の にバインドする代わりにPushPinLocation、コレクションを使用します。ViewModel で、これを追加します。

private List<GeoCoordinate> _pushPinLocations;
public List<GeoCoordinate> PushPinLocations
{
    get { return _pushPinLocations; }
    set
    {
        _pushPinLocations = value;
        OnPropertyChanged("PushPinLocations");
    }
}

イベントを次のように変更します。

private void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    this.PushPinLocations.Add(args.Position.Coordinate.ToGeoCoordinate());
}

これにより、新しい場所がリストに追加され、この場所のリストにバインドされている限り、すべてのピンが表示されます。

<maptk:MapItemsControl Name="StoresMapItemsControl" >
    <maptk:MapItemsControl.ItemTemplate>
        <DataTemplate>
             <maptk:Pushpin x:Name="PushPins" Background="White" 
                GeoCoordinate="{Binding PushPinLocations}" 
                Content="{Binding PushPinDisplayText}" 
                Visibility="Visible" />
        </DataTemplate>
    </maptk:MapItemsControl.ItemTemplate>
</maptk:MapItemsControl>             
于 2014-11-05T19:42:52.453 に答える