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,而不是通过编辑地图服务上的图层或功能。也许我应该使用自定义渲染器?
答案 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,请告诉我。