Solved! Go to Solution.
A.2 layer is visble in map. But A.2 has been removed successfully on legend refreshed event
foreach (var pair in toDeletes) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); Layer layer = parentLayerItem.Layer; int subID = layerItemToDelete.SubLayerID; if (layer is ISublayerVisibilitySupport && subID > 0)* (layer as ISublayerVisibilitySupport).SetLayerVisibility(subID, false); parentLayerItem.Layer.SetSublayerViisbility(layerItemToDelete.SublayerId, false); }private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e)
{
List<LayerItemViewModel> removeLayerItemVM = new List<LayerItemViewModel>();
List<LayerItemViewModel> removeLayerItemVM2 = new List<LayerItemViewModel>();
List<string> removeLayers = new List<string>();
removeLayers.Add("Service Agreement Areas");
removeLayers.Add("HTE Routes");
removeLayers.Add("Water 3-way");
removeLayers.Add("Water 4-way");
removeLayers.Add("Water 5-way");
removeLayers.Add("Water 6-way");
if (e.LayerItem.LayerItems != null)
{
foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems)
{
//removes the feature layers in the water group layer from the legend:
foreach (LayerItemViewModel livm in layerItemVM.LayerItems)
{
foreach (string rlayer in removeLayers)
{
if (livm.Label == rlayer)
removeLayerItemVM2.Add(livm);
}
}
foreach (LayerItemViewModel rlivm in removeLayerItemVM2)
{
layerItemVM.LayerItems.Remove(rlivm);
}
//collapses all the legend items:
if (layerItemVM.IsExpanded == true)
{
layerItemVM.IsExpanded = false;
for (int i = 0; i < layerItemVM.LayerItems.Count; i++)
{
layerItemVM.LayerItems.IsExpanded = false;
}
}
//removes all the other group layers from the legend:
if (layerItemVM.Label == "General Layers")
removeLayerItemVM.Add(layerItemVM);
else if (layerItemVM.Label == "Storm Layers")
removeLayerItemVM.Add(layerItemVM);
else if (layerItemVM.Label == "Sewer Layers")
removeLayerItemVM.Add(layerItemVM);
}
foreach (LayerItemViewModel remLayerItemVM in removeLayerItemVM)
{
e.LayerItem.LayerItems.Remove(remLayerItemVM);
}
}
else
{
e.LayerItem.IsExpanded = false;
}
}Basically I look for recursive loop logic to handle the case. I have seen another thread where dbroux provided sample for getting selecetd items but that does not help me.
public static class LegendExtensions{ // Go recursively through the LayerItems and return a tuple <parent, child> for each child public static IEnumerable<Tuple<LayerItemViewModel, LayerItemViewModel>> GetAllParentChild(this LayerItemViewModel layerItem) { return layerItem == null || layerItem.LayerItems == null ? Enumerable.Empty<Tuple<LayerItemViewModel, LayerItemViewModel>>() : layerItem.LayerItems.SelectMany(child => new[] { new Tuple<LayerItemViewModel, LayerItemViewModel>(layerItem, child) }.Concat(GetAllParentChild(child))); } }
var toDeletes = LayerItem.GetAllParentChild().Where(pair => new[] {"Service Agreement Areas", "HTE Routes", ....}.Contains(pair.Item2.Label)).ToArray(); foreach (var pair in toDeletes) pair.Item1.LayerItems.Remove(pair.Item2);
dbroux ,
Thank you. I could able to get tuple pair of parent,child which I need to delete. But I do not understand second part, can you please explain in simple terms?.
foreach (var pair in toDeletes) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); }
IEnumerable<Tuple<LayerItemViewModel, LayerItemViewModel>> tupleParentChild; // declaration
if (e.LayerItem.LayerItems != null)
{
foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems)
{
if (layerItemVM.IsGroupLayer)
{
composites.Add(layerItemVM);
while (composites.Count > 0)
{
LayerItemViewModel layerItemVMGroup = composites[0];
foreach (LayerItemViewModel innerLayerItems in layerItemVMGroup.LayerItems)
{
if (innerLayerItems.IsGroupLayer == false)
{
innerLayerItems.IsExpanded = true;
// Requirement : If strVisibleArray3D does not contains then remove the layer from Legend
if (!strVisibleArray3D.Contains(innerLayerItems.Label))
{
// dbroux method to get the parent child using legend extension method
tupleParentChild = LegendExtension.GetAllParentChild(innerLayerItems);
// issue always tupleParentChild has a pair of values but looping does not taking place
foreach (var pair in tupleParentChild.ToArray())
{
var parentLayerItem = pair.Item1;
var layerItemToDelete = pair.Item2;
parentLayerItem.LayerItems.Remove(layerItemToDelete);
}
}
else
{
if (strPrefLayers.Contains(innerLayerItems.Label))
{
innerLayerItems.IsEnabled = true;
innerLayerItems.IsSelected = true;
}
}
}
else
{
composites.Add(innerLayerItems);
}
}
composites.Remove(layerItemVMGroup);
}
}
else
{
if (!strVisibleArray3D.Contains(layerItemVM.Label))
{
// remove the layer
}
else
{
if (strPrefLayers.Contains(layerItemVM.Label))
{
layerItemVM.IsEnabled = true;
layerItemVM.IsSelected = true;
}
}
}
}
private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e)
{
List<string> removeLayers = new List<string>
{
"Service Agreement Areas",
"HTE Routes",
"Water 3-way",
"Water 4-way",
"Water 5-way",
};
var toDeletes = LayerItem.GetAllParentChild().Where(pair => removeLayers.Contains(pair.Item2.Label)).ToArray();
foreach (var pair in toDeletes)
pair.Item1.LayerItems.Remove(pair.Item2);
}