How to control layer-visibilty individually with LayerTemplate

3733
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