使用mvvm模型在Windows手机中的地图上显示多个图钉

时间:2013-11-07 08:37:48

标签: c# windows-phone-7 mvvm windows-phone-8 windows-phone

我在基于mvvm模型的应用程序中有以下视图,它应该显示我使用我视图模型中的绑定属性“PushPinLocation”绑定到它的所有图钉。

<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已更改事件我正在设置pushpinlocation:

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

但是我总是看到最新的一个出现,旧的那些从未在地图上显示。我有什么方法可以保留旧的。

1 个答案:

答案 0 :(得分:2)

这篇帖子已经有一年了,但没有答案,所以这是我的回答:

使用集合,而不是绑定到单个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>