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);
}
}