Get Item Index during Binding for ListBox and ItemsControl
For ListBox:
<DataTemplate x:Key="myItemTemplate">
<StackPanel>
<TextBlock x:Name="m_HiddenIndex" Visibility="Collapsed" Text="{Binding Path=., Converter={StaticResource MyConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}}"/>
<StackPanel Orientation="Horizontal" x:Name="Normal">
<TextBlock Text="{Binding Path=Text, ElementName=m_HiddenIndex}"/>
<TextBlock Text="{Binding Path=.}" Foreground="Red"/>
</StackPanel>
<StackPanel Orientation="Horizontal" x:Name="First" Visibility="Collapsed">
<TextBlock Text="{Binding Path=Text, ElementName=m_HiddenIndex}"/>
</StackPanel>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Text, ElementName=m_HiddenIndex}" Value="0">
<DataTrigger.Setters>
<Setter Property="Visibility" Value="Collapsed" TargetName="Normal" />
<Setter Property="Visibility" Value="Visible" TargetName="First" />
</DataTrigger.Setters>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ListBoxItem item = value as ListBoxItem;
ListBox view = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;
int index = view.ItemContainerGenerator.IndexFromContainer(item);
return index;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
But in most scenarios, you don't need any style of ListBox, then use ItemsContronl.
For ItemsControl:
<DataTemplate x:Key="myItemTemplate">
<StackPanel>
<TextBlock x:Name="m_HiddenIndex" Visibility="Collapsed" Text="{Binding Path=., Converter={StaticResource MyConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType=ContentPresenter}}"/>
<StackPanel Orientation="Horizontal" x:Name="Normal">
<TextBlock Text="{Binding Path=Text, ElementName=m_HiddenIndex, StringFormat='Hello {0}'}"/>
<TextBlock Text="{Binding Path=.}" Foreground="Red"/>
</StackPanel>
<StackPanel Orientation="Horizontal" x:Name="First" Visibility="Collapsed">
<TextBlock Text="{Binding Path=Text, ElementName=m_HiddenIndex}"/>
</StackPanel>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Text, ElementName=m_HiddenIndex}" Value="0">
<DataTrigger.Setters>
<Setter Property="Visibility" Value="Collapsed" TargetName="Normal" />
<Setter Property="Visibility" Value="Visible" TargetName="First" />
</DataTrigger.Setters>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ContentPresenter item = value as ContentPresenter;
ItemsControl view = ItemsControl.ItemsControlFromItemContainer(item) as ItemsControl;
int index = view.ItemContainerGenerator.IndexFromContainer(item);
return index;
}
浙公网安备 33010602011771号