One way of achieving this is to create your own class MyLayerInfo with additional property IsVisible, using an ObservableCollection of this type as ItemsSource for your listbox, and adding a method that updates IsVisible property by checking dynamic layer's VisibleLayers.Xaml-code: (update ListBox)
<ListBox x:Name="SubLayerListBox" Margin="0,5,0,0"
Grid.Row="1">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Margin="2"
Name="DynamicLayerCalifornia"
Content="{Binding LayerInfo.Name}"
IsChecked="{Binding IsVisible}"
Tag="{Binding LayerInfo.ID}"
ClickMode="Press"
Click="CheckBox_Click" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Code-behind: (update ListBox' ItemsSource)
ObservableCollection<MyLayerInfo> MySubLayers = new ObservableCollection<MyLayerInfo>();
public SubLayerList()
{
InitializeComponent();
this.SubLayerListBox.ItemsSource = MySubLayers;
}
private void ArcGISDynamicMapServiceLayer_Initialized(object sender, EventArgs e)
{
ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer dynamicServiceLayer =
sender as ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer;
foreach (LayerInfo l in dynamicServiceLayer.Layers)
MySubLayers.Add(new MyLayerInfo(l));
if (dynamicServiceLayer.VisibleLayers == null)
dynamicServiceLayer.VisibleLayers = GetDefaultVisibleLayers(dynamicServiceLayer);
UpdateIsVisibleProperty(dynamicServiceLayer.VisibleLayers.ToList());
}
//TODO: call this method everytime dynamicServiceLayer.VisibleLayers is updated
private void UpdateIsVisibleProperty(List<int> visibleLayerList)
{
foreach (MyLayerInfo info in MySubLayers)
info.IsVisible = visibleLayerList.Contains(info.LayerInfo.ID);
}
public class MyLayerInfo : INotifyPropertyChanged
{
public MyLayerInfo(LayerInfo info)
{
LayerInfo = info;
}
private LayerInfo layerInfo;
public LayerInfo LayerInfo
{
get { return layerInfo; }
set
{
if (layerInfo != value)
{
layerInfo = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("LayerInfo"));
}
}
}
bool isVisible;
public bool IsVisible
{
get { return isVisible; }
set
{
if (isVisible != value)
{
isVisible = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsVisible"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}