Bing地图 - 自动更新图钉的位置绑定

时间:2010-11-18 15:25:45

标签: wpf data-binding binding location bing-maps

我正在使用Bing Maps控件来显示一系列自定义图钉,表示不断移动和改变状态的对象。

使用数据绑定正在更新对象的各种属性,但由于某些原因,这不适用于它们的位置。

我将地图绑定到ObservableCollection:

<UserControl.Resources>    
    <DataTemplate x:Key="PushpinTemplate">
        <v:CustomPushpin />
    </DataTemplate>
</UserControl.Resources>

...

<m:Map Name="map">
   <m:MapItemsControl ItemTemplate="{StaticResource PushpinTemplate}" ItemsSource="{Binding Objects}" />
</m:Map>

...并在CustomPushpin中:

<UserControl
...    
   m:MapLayer.Position="{Binding Location}" m:MapLayer.PositionOrigin="BottomCenter"
   mc:Ignorable="d" d:DesignHeight="126" d:DesignWidth="85">

与所有其他属性一样,使用INotifyPropertyChanged实现各个对象的位置。

private Location _location;
public Location Location
{
   get { return _location; }
   set { _location = value; OnPropertyChanged("Location"); }
}

当地图移动时,无论是因为平移还是缩放,对象都会移动,但其他情况不会移动。

我无法确定我在这里做错了什么,或者是否是Bing Maps控件的问题。

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

请勿更新位置,如下所示:

<input>

而是创建一个新对象:

_pushPin.Location.Latitude = xyz...

否则_pushPin.Location = new Location(_location); 最终会以某种方式失去对更新的追踪

答案 1 :(得分:1)

刷新视图

map.SetView(map.BoundingRectangle); 

作品

答案 2 :(得分:1)

刷新视图对我不起作用。而不是重新创建Pushpin,最简单的解决方案是:

_pushPin.Location = null;
_pushPin.Location = _location;

_pushPin.Location = new Location(_location);

希望这有帮助。

答案 3 :(得分:1)

我在这里找到了Candritzky的解决方法:Solution link with code

基本上,您必须将ItemsPanel更改为公开新AttachedProperty的自定义广告。对我来说它有效:)

答案 4 :(得分:0)

我发现了一些here:好像Bing的地图控件中存在一个错误。 我甚至尝试了建议的解决方法,但它不适合我

答案 5 :(得分:0)

如果有人想知道,我的解决方案是创建自己的课程ObjectCollection并继承自ObservableCollection<Object>。像这样添加方法ObjectCollection.Refresh():

public void Refresh()
{
    base.OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset));
}

并在循环中重新填充集合后调用此方法。