How to control layer-visibilty individually with LayerTemplate

3773
3
12-02-2015 08:29 AM
FabianDeffert
New Contributor

We are using ArcGIS Runtime .NET 10.2.6 and the legend-control in ArcGIS Runtime Toolkit for Windows Desktop.

We are trying to add a checkbox to each subLayer from a DynamicMapService to switch visibility. We've been able to add a checkbox defined in a LayerTemplate.

So far, we have (based on the runtime .NET sample "LegendsInTreeViewSample):

<esri:Legend x:Name="legend2" Layers="{Binding Converter={StaticResource enumerator}}" ShowOnlyVisibleLayers="False" >
                                            <esri:Legend.LayerTemplate>
                                                <DataTemplate>
                                                    <StackPanel Orientation="Horizontal">
                                                        <CheckBox Content="{Binding Label}"  IsChecked="{Binding IsEnabled, Mode=TwoWay}"/>
                                                    </StackPanel>
                                                </DataTemplate>
                                            </esri:Legend.LayerTemplate>
                                        </esri:Legend>

runtime_layerTemplate.PNG

In line 5 the binding of the property "Label" works fine, it shows the layers lable.

Unfortunately it doesn't work with the property "IsEnabled": if one checkbox is cheked/unchecked, all other layers on the same level are also affected .

Has anyone experienced similar behavior?

Is there a workaround to achieve the desired behavior?

Thanks in advance,

Fabian
0 Kudos
3 Replies
BrianFoley1
New Contributor

I have the same question as you.  Only, I am trying to show checkboxes on all the lowest levels in the legends.  Did you ever get this to work ?

--Brian

0 Kudos
BrianFoley1
New Contributor

Fabian, did you ever get this to work ?

0 Kudos
FabianDeffert
New Contributor

It's been a while, but we cretaed a workaround to make the legend work as desired, at least in our case.


We added a IValueConverter for IsChecked-Property of the CheckBox:

<esri:Legend.LayerTemplate>
                                                <DataTemplate>
                                                    <!--<StackPanel Orientation="Horizontal">-->
                                                    <CheckBox Content="{Binding Label}" IsChecked="{Binding Converter={StaticResource myLayerVisibilityConverter}, Mode=OneWay}" Tag="{Binding}" Checked="chkLayerTemplate_Checked" Unchecked="chkLayerTemplate_UnChecked"/>
                                                    <!--</StackPanel>-->
                                                </DataTemplate>
                                            </esri:Legend.LayerTemplate>


The converter:

public sealed class LayerItemViewModelToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            LayerItemViewModel _vmodel = value as LayerItemViewModel;
            if (_vmodel as LayerItemViewModel == null)
                return true;
            ArcGISDynamicMapServiceLayer _layerParent = _vmodel.Layer as ArcGISDynamicMapServiceLayer;
            if (_layerParent == null)
                return true;
            bool isVisible = true;
            int subID = _vmodel.SubLayerID;
            if (_layerParent.VisibleLayers != null)
            {
                if (!_layerParent.VisibleLayers.Contains(subID))
                    isVisible = false;
            }
            return isVisible;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


And in code-behind the checked and unchecked-events of the CheckBox:

private void chkLayerTemplate_Checked(object sender, RoutedEventArgs e)
        {
            if (!(sender is CheckBox))
                return;
            Esri.ArcGISRuntime.Toolkit.Controls.Primitives.LayerItemViewModel _layerVM = ((CheckBox)sender).Tag as Esri.ArcGISRuntime.Toolkit.Controls.Primitives.LayerItemViewModel;
            if (_layerVM == null)
                return;
            ArcGISDynamicMapServiceLayer _layerParent = _layerVM.Layer as ArcGISDynamicMapServiceLayer;
            if (_layerParent == null)
                return;
            var subId = _layerVM.SubLayerID;
            if (_layerParent.VisibleLayers != null)
            {
                if (!_layerParent.VisibleLayers.Contains(subId))
                    _layerParent.VisibleLayers.Add(subId);
            }
         
        }

 private void chkLayerTemplate_UnChecked(object sender, RoutedEventArgs e)
        {
            if (!(sender is CheckBox))
                return;
            Esri.ArcGISRuntime.Toolkit.Controls.Primitives.LayerItemViewModel _layerVM = ((CheckBox)sender).Tag as Esri.ArcGISRuntime.Toolkit.Controls.Primitives.LayerItemViewModel;
            if (_layerVM == null)
                return;
            ArcGISDynamicMapServiceLayer _layerParent = _layerVM.Layer as ArcGISDynamicMapServiceLayer;
            if (_layerParent == null)
            {
                ((CheckBox)sender).IsChecked = true; //no other types
                return;
            }
            var subId = _layerVM.SubLayerID;
            
            if (_layerParent.VisibleLayers != null)
            {
                if (_layerParent.VisibleLayers.Contains(subId))
                    _layerParent.VisibleLayers.Remove(subId);
            }
        }
0 Kudos