Search code examples
wpflistview

How to display row numbers in a ListView?


The obvious solution would be to have a row number property on a ModelView element, but the drawback is that you have to re-generate those when you add records or change sort order.

Is there an elegant solution?


Solution

  • I think you have the elegant solution, but this works.

    XAML:

    <ListView Name="listviewNames">
      <ListView.View>
        <GridView>
          <GridView.Columns>
            <GridViewColumn
              Header="Number"
              DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, 
                                             AncestorType={x:Type ListViewItem}}, 
                                             Converter={StaticResource IndexConverter}}" />
            <GridViewColumn
              Header="Name"
              DisplayMemberBinding="{Binding Path=Name}" />
          </GridView.Columns>
        </GridView>
      </ListView.View>
    </ListView>
    

    ValueConverter:

    public class IndexConverter : IValueConverter
    {
        public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
        {
            ListViewItem item = (ListViewItem) value;
            ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
            int index = listView.ItemContainerGenerator.IndexFromContainer(item);
            return index.ToString();
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }