tags:

views:

1277

answers:

3

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?

+2  A: 

I think you have the elegant solution, but this works

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

(Sorry about the formatting!)

and then create a 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();
}

}

amaca
A: 

That won't work when you insert or delete an item in the list, because the binding source does not receive CollectionChanged event. So my solution is the un-elegant one, just as saldoukhov stated.

A: 

Hi There

That won't work when you insert or delete an item in the list, because the binding source does not receive Collection Changed event.if you then comes to a way

Thanks & Regards

Ankit Moradiya

ankit moradiya