I answered to a similar question in this thread.
Hope this helps.
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(); };
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
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; }
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.
- 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.