如何使用带有数据绑定的ArcGIS for WPF自定义符号?

时间:2013-12-13 01:23:08

标签: wpf mvvm arcgis esri

Esri的ArcGIS for WPF似乎没有任何真正的MVVM支持或绑定支持;除非我弄错了。

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

我实施了一个与IGeoPositionWatcher<GeoCoordinate>一起使用的自定义GpsLayer。一切都很完美。我可以修改GPS坐标,地图上的小点可以顺利移动到最后的休息处。我的问题是我不能使用GpsLayer附带的小点和箭头。我需要一个自定义MarkerSymbol类似于以下内容:

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

我有一个列表(数量未知并且在任何给定时刻发生变化)这些“pogosticks”总是通过GPS跟踪并需要根据其状态更新符号。问题是我无法将Pogostick对象作为自定义DataContext的{​​{1}},并且我的图片来源和文字不显示。

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

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

1 个答案:

答案 0 :(得分: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 for WPF会自动将MarkerSymbol的{​​{1}}分配给它的密封类DataContext,其中包含对DataBinding分配的引用到MarkerSymbol的{​​{1}}。因此,我可以通过此绑定访问我的自定义符号GpsLayer属性。

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

Entity

注意:当地图的MarkerSymbol属性设置为GpsLayer layer = new GpsLayer(); EntityMarkerSymbol marker = new EntityMarkerSymbol() { Entity = pogoStick }; marker.ControlTemplate = Application.Current.Resources["ConvoyMarker"] as ControlTemplate; layer.LocationMarkerSymbol = marker; 时,无法使用此方法。如果有人可以弄清楚如何使用此属性设置为true,请告诉我。