2013-12-13 27 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,請讓我知道。

相關問題