【问题标题】:Bing Maps - Auto update location binding of pushpins必应地图 - 图钉的自动更新位置绑定
【发布时间】:2011-05-12 02:43:36
【问题描述】:

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

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

我将地图绑定到 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 地图控件有问题。

有什么想法吗?

【问题讨论】:

  • 我遇到了同样的问题 :( 知道可能出了什么问题吗?

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


【解决方案1】:

我发现了一些东西here:微软的必应地图控件中似乎存在错误。 我什至尝试了建议的解决方法,但它对我不起作用

【讨论】:

  • 是的,我确实考虑过改变视图,虽然不完全是这种方式,但我从未尝试过。我最终做的是“简单地”移除并重新添加带有引脚的层。我知道这听起来像是一个非常繁重的操作,但从结果来看,它似乎不是!?
  • 相反,我尝试简单地移除旧图钉并使用新位置重新创建一个新图钉。不知道什么操作比较重...
  • 或者更好的是,我从集合中移除图钉,更改位置,然后重新插入更新的图钉:集合是可观察的,因此 UI 会拦截此更改并相应地更新自身。仍然不要'不知道什么操作比较重...
【解决方案2】:

如果有人想知道,我的解决方案是创建自己的类 ObjectCollection 并从 ObservableCollection&lt;Object&gt; 继承。像这样添加一个方法 ObjectCollection.Refresh():

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

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

【讨论】:

    【解决方案3】:

    刷新视图

    map.SetView(map.BoundingRectangle); 
    

    作品

    【讨论】:

      【解决方案4】:

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

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

      _pushPin.Location = new Location(_location);
      

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          不要更新位置,像这样:

          _pushPin.Location.Latitude = xyz...
          

          而是创建一个新对象:

          _pushPin.Location = new Location(_location);
          

          否则BingMap 最终会不知何故忘记更新

          【讨论】:

            猜你喜欢
            • 2017-01-12
            • 1970-01-01
            • 1970-01-01
            • 2011-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多