Here is a hacking solution. We can use Value Conversion with a DataBinding. So, the first step is to declare our ValueConvertor:
public class ListItemToPositionConverter : IValueConverter { #region Implementation of IValueConverter public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var item = value as ListBoxItem; if (item != null) { var lb = FindAncestor<ListBox>(item); if (lb != null) { var index = lb.Items.IndexOf(item.Content); return index; } } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } #endregion }
Declare wherever you want this static method to get the ListBox parent:
public static T FindAncestor<T>(DependencyObject from) where T : class { if (from == null) return null; var candidate = from as T; return candidate ?? FindAncestor<T>(VisualTreeHelper.GetParent(from)); }
Then in ListBox.Resources declares our converter as follows:
<ListBox.Resources> <YourNamespace:ListItemToPositionConverter x:Key="listItemToPositionConverter"/> </ListBox.Resources>
And finally - DataTemplate:
<ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Converter={StaticResource listItemToPositionConverter}}"/> <Label Content="{Binding Path=DisplayName}"></Label> </StackPanel> </DataTemplate> </ListBox.ItemTemplate>
Note: in this example, the elements will be listed starting from 0 (zero), you can change it in the Convert method by adding 1 to the result.
Hope this helps ...
Eugene cheverda
source share