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

  

posted on 2011-09-21 05:29  Cooldash  阅读(491)  评论(0)    收藏  举报

导航