2013-12-13 28 views
0

Esri的ArcGIS for WPF似乎没有任何真正的MVVM支持或绑定支持;除非我错了。如何将ArcGIS for WPF自定义符号与数据绑定一起使用?

无论如何,我正在创建一个跟踪应用程序,它需要通过GPS坐标跟踪对象。

我实施了一个自定义IGeoPositionWatcher<GeoCoordinate>,它与GpsLayer一起使用。这一切都完美。我可以修改GPS坐标,并且我地图上的小点可以平稳移动到最终的安放位置。我的问题是我不能使用GpsLayer附带的小点和箭头。我需要一个定制MarkerSymbol是类似如下的内容:(在任何特定时刻量未知和变化),这些“pogosticks”,它总是由GPS追踪

<Grid> 
    <Image Source="{Binding Pogostick.HeightImage}" /> 
    <TextBlock Text="{Binding Pogostick.PogoId}" /> 
</Grid> 

我有一个列表,并需要有符号根据其状态更新。问题是,我无法获得Pogostick对象为DataContext的自定义MarkerSymbol.ControlTemplate,并且那里没有显示我的图像源和文本。

我试图避免在GraphicLayer中使用Graphic,并且希望这可以与GpsLayer一起使用。有没有办法做到这一点?我是否正确地接近这个...我应该使用GraphicLayer还是FeatureLayer

我想要在用户的桌面应用上呈现这些跟踪的pogosticks,而不是通过编辑地图服务上的图层或功能。也许我应该使用自定义渲染器?

回答

1

我已经想出了一个办法来做到这一点。我创建了一个继承自MarkerSymbol的类,它有一个DependencyProperty,它持有我想要绑定到的对象(Pogostick类)。

public class EntityMarkerSymbol : MarkerSymbol 
{ 
    public static readonly DependencyProperty EntityProperty; 

    static EntityMarkerSymbol() 
    { 
     EntityMarkerSymbol.EntityProperty = DependencyProperty.Register("Entity", typeof(object), typeof(EntityMarkerSymbol), new PropertyMetadata()); 
     return; 
    } 

    public EntityMarkerSymbol() 
    { 
     return; 
    } 

    public object Entity 
    { 
     get { return this.GetValue(EntityMarkerSymbol.EntityProperty); } 
     set { this.SetValue(EntityMarkerSymbol.EntityProperty, value); } 
    } 
} 

然后我在一个资源字典创建ControlTemplate像这样:

<ControlTemplate x:Key="PogostickMarker"> 
    <StackPanel> 
     <Image Source="{Binding Symbol.Entity.HeightImage}" /> 
     <TextBlock Text="{Binding Symbol.Entity.PogostickId}" /> 
    </StackPanel> 
</ControlTemplate> 

这一工作的关键是ArcGIS中WPF将自动分配MarkerSymbolDataContext到它的密封DataBinding类包含对分配给GpsLayerLocationMarkerSymbolMarkerSymbol的引用。所以我可以通过这个绑定来访问我的自定义符号Entity属性。

用于创建GpsLayer并分配MarkerSymbol的代码如下:

GpsLayer layer = new GpsLayer(); 
EntityMarkerSymbol marker = new EntityMarkerSymbol() { Entity = pogoStick }; 

marker.ControlTemplate = Application.Current.Resources["ConvoyMarker"] as ControlTemplate; 
layer.LocationMarkerSymbol = marker; 

注:如果地图的UseAcceleratedDisplay属性设置为True不能使用这种方法。如果有人可以弄清楚如何使用这种方法将该属性设置为true,请让我知道。

相关问题