I have a sorted listbox and need to display each item’s row number. In this demo I have a Person class with a Name string property. The listbox displays a a list of Persons sorted by Name. How can I add to the datatemplate of the listbox the row number???
XAML:
<Window x:Class='NumberedListBox.Window1' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' Height='300' Width='300'> <ListBox ItemsSource='{Binding Path=PersonsListCollectionView}' HorizontalContentAlignment='Stretch'> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text='{Binding Path=Name}' /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Window>
Code behind:
using System; using System.Collections.ObjectModel; using System.Windows.Data; using System.Windows; using System.ComponentModel; namespace NumberedListBox { public partial class Window1 : Window { public Window1() { InitializeComponent(); Persons = new ObservableCollection<Person>(); Persons.Add(new Person() { Name = 'Sally'}); Persons.Add(new Person() { Name = 'Bob' }); Persons.Add(new Person() { Name = 'Joe' }); Persons.Add(new Person() { Name = 'Mary' }); PersonsListCollectionView = new ListCollectionView(Persons); PersonsListCollectionView.SortDescriptions.Add(new SortDescription('Name', ListSortDirection.Ascending)); DataContext = this; } public ObservableCollection<Person> Persons { get; private set; } public ListCollectionView PersonsListCollectionView { get; private set; } } public class Person { public string Name { get; set; } } }
This should get you started:
http://weblogs.asp.net/hpreishuber/archive/2008/11/18/rownumber-in-silverlight-datagrid-or-listbox.aspx
It says it’s for Silverlight, but I don’t see why it wouldn’t work for WPF. Basically, you bind a TextBlock to your data and use a custom value converter to output the current item’s number.