For Each livm As LayerItemViewModel In esriLegend.LayerItems If TypeOf livm.Layer Is ArcGISDynamicMapServiceLayer Then Dim agdsl As ArcGISDynamicMapServiceLayer = CType(livm.Layer, ArcGISDynamicMapServiceLayer) Dim dvl As List(Of Integer) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = True And x.SubLayerIds Is Nothing Select x.ID).ToList Dim gl As List(Of LayerInfo) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = False And x.SubLayerIds IsNot Nothing).ToList For Each li As LayerInfo In gl For Each i As Integer In li.SubLayerIds dvl.Remove(i) Next Next agdsl.VisibleLayers = dvl.ToArray End If Next
Dim dvl As List(Of Integer) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = True Select x.ID).ToList agdsl.VisibleLayers = dvl.ToArray
That being said, my feeling is that you shoud get the expected result with code like:Dim dvl As List(Of Integer) = (From x In agdsl.Layers Where CBool(x.DefaultVisibility) = True Select x.ID).ToList agdsl.VisibleLayers = dvl.ToArray
var ids = new List<int>();
var parentLayers = _dmsl.Layers.Where(x => x.SubLayerIds != null).ToArray();
foreach (var l in _dmsl.Layers)
{
if (parentLayers.Contains(l) && l.DefaultVisibility)
{
ids.Add(l.ID);
}
else
{
//find the parent of the child layer
var pl = parentLayers.Where(x => x.SubLayerIds.Contains(x.ID)).FirstOrDefault();
//iterate through parent layers until we reached the outermost parent
while (parentLayers.Contains(pl))
{
var tempPl = parentLayers.Where(x => x.SubLayerIds.Contains(pl.ID)).FirstOrDefault();
if (tempPl == null)
break;
else
pl = tempPl;
}
//determine if the layer should be visible
if (pl != null)
{
if (pl.DefaultVisibility && l.DefaultVisibility)
ids.Add(l.ID);
}
}
}