<esri:Map x:Name="MyMap" > <esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer" Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer"/> <esri:FeatureLayer ID="MyFeatureLayer2" Url="http://192.168.1.52/ArcGIS/rest/services/RMS_BOUNDARIES/MapServer/1" Where="DISTRICT_ID = 5" > </esri:FeatureLayer> </esri:Map>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ListBox Margin="0" IsHitTestVisible="False" BorderThickness="0"
ItemsSource="{Binding ElementName=MyMap, Path=Layers.[MyFeatureLayer2].LayerInfo.Renderer.Infos}"
Grid.Row="1">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<esriToolkitPrimitives:SymbolDisplay
Symbol="{Binding Symbol}"
Width="20" Height="20"
VerticalAlignment="Center" />
<TextBlock Text="{Binding Label}"
FontSize="10"
VerticalAlignment="Center"
Margin="5,0,0,0" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</ScrollViewer>ItemsSource="{Binding ElementName=MyMap, Path=Layers.[MyFeatureLayer2].LayerInfo.Renderer.Infos}"
The problem is coming from your ItemsSource binding:
With this binding you will get all renderer infos whatever it's used or not.
One option is you to implement by code your own enumeration that returns only the symbols used in the layer.
ESRI.ArcGIS.Client.Toolkit.Legend.RefreshedEventArgs e)
{
var fLayer = e.LayerItem.Layer as FeatureLayer;
if (fLayer != null && fLayer.ID == "MyFeatureLayer2" && e.LayerItem.LegendItems != null)
{
var toRemove = e.LayerItem.LegendItems.Where(item => item.Label != "7").ToArray(); // Warning : may be a coded value instead of just '7'. Depending on your model
foreach (var item in toRemove)
e.LayerItem.LegendItems.Remove(item);
}
}