- Toggling on the GroupLayer turns on the transfered in FeatureLayer, even if the latter is off.
void GroupLayerItem_PropertyChanged(object sender, PropertyChangedEventArgs e) { // synchronize feature layer visibility on group layer if (e.PropertyName == "IsVisible" && !_groupLayerItem.IsVisible) _featureLayerItem.Layer.Visible = _groupLayerItem.IsVisible; }
- Toggling on the transfered in FeatureLayer turns on the GroupLayer, which is different behavior than the non transfered in FeatureLayers in the GroupLayer.
That being said, I don't see why you don't set the layers in your map as you want to see them in the legend. But I may miss something.
Hm, maybe not possible/practical?
private LayerItemViewModel _featureLayerItem; private LayerItemViewModel _groupLayerItem; private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { var legend = sender as Legend; if (legend == null) return; // initialize group layer item once if (_groupLayerItem == null) { _groupLayerItem = legend.LayerItems.FirstOrDefault(l => l.Layer is GroupLayer); // here we suppose there is only one group layer but might be based on ID as well if (_groupLayerItem != null) _groupLayerItem.PropertyChanged += GroupLayerItem_PropertyChanged; } if (e.LayerItem.Layer is FeatureLayer && _groupLayerItem != null && !_groupLayerItem.LayerItems.Contains(e.LayerItem)) { _featureLayerItem = e.LayerItem; // store feature layer item _featureLayerItem.PropertyChanged += FeatureLayerItem_PropertyChanged; legend.LayerItems.Remove(_featureLayerItem); // remove feature layer from the legend root (else it would be duplicated) // Add feature layer item in the group layer _groupLayerItem.LayerItems.Add(_featureLayerItem); } } void GroupLayerItem_PropertyChanged(object sender, PropertyChangedEventArgs e) { // synchronize feature layer visibility on group layer if (e.PropertyName == "IsVisible") _featureLayerItem.Layer.Visible = _groupLayerItem.IsVisible; } void FeatureLayerItem_PropertyChanged(object sender, PropertyChangedEventArgs e) { // if feature layer item is toggled on, toggle on the group layer as well if (e.PropertyName == "IsEnabled" && _groupLayerItem != null && ((LayerItemViewModel)sender).IsEnabled) _groupLayerItem.IsEnabled = true; }
Private Sub UpdateFeatureLayerVisibility(sender As Layer) If _seaBirdsLivm IsNot Nothing AndAlso _environtmentalGroupLayerLivm IsNot Nothing Then _seaBirdsLivm.IsEnabled = _environtmentalGroupLayerLivm.Layer.Visible AndAlso _environtmentalGroupLayerLivm.IsEnabled End If End Sub Private _seaBirdsHasBeenReordered As Boolean Private _environtmentalGroupLayerLivm As LayerItemViewModel Private _seaBirdsLivm As LayerItemViewModel Private Sub esriLegend_Refreshed(sender As Object, e As Toolkit.Legend.RefreshedEventArgs) If e.LayerItem.Label = "Sea Birds" Then _seaBirdsLivm = e.LayerItem e.LayerItem.LayerItems = Nothing End If If Not _seaBirdsHasBeenReordered Then _environtmentalGroupLayerLivm = esriLegend.LayerItems.FirstOrDefault(Function(l) l.Label = "Environmental Layers") If _environtmentalGroupLayerLivm IsNot Nothing AndAlso _environtmentalGroupLayerLivm.LayerItems IsNot Nothing AndAlso _seaBirdsLivm IsNot Nothing Then AddHandler _environtmentalGroupLayerLivm.Layer.PropertyChanged, Sub(s As Object, evt As PropertyChangedEventArgs) If evt.PropertyName = "Visible" Then UpdateFeatureLayerVisibility(CType(s, Layer)) End If End Sub _environtmentalGroupLayerLivm.LayerItems.Insert(0, _seaBirdsLivm) esriLegend.LayerItems.Remove(_seaBirdsLivm) _seaBirdsHasBeenReordered = True End If Else If _seaBirdsLivm IsNot Nothing Then esriLegend.LayerItems.Remove(_seaBirdsLivm) End If End Sub
Thanks Dbroux. However, there seem to be differences between the GroupLayer type and types that impliment ISubLayerVisibilitySupport (Like ArcGISDynamicMapServiceLayer). I can't seem to find the right combination of handlers that mimic the functionality of an unmodified GroupLayer (all childlayers of the group respecting the visibility of the parent grouplayer).
_groupLayerItem .Layer.PropertyChanged += (s, evt) => { if (evt.PropertyName == "Visible") UpdateFeatureLayerVisibility(); };
I answered to a similar question in this thread.Hope this helps.
Aangemelde leden kunnen berichten plaatsen, updates volgen en meer. Nieuw hier? Registreer een gratis account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.