How to display row numbers in a ListView?

前端 未结 10 901
盖世英雄少女心
盖世英雄少女心 2020-11-27 04:33

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 sor

10条回答
  •  佛祖请我去吃肉
    2020-11-27 05:17

    Here is another way, including code comments that will help you understand how it works.

    public class Person
    {
        private string name;
        private int age;
        //Public Properties ....
    }
    
    public partial class MainWindow : Window
    {
    
        List personList;
        public MainWindow()
        {
            InitializeComponent();
    
            personList= new List();
            personList.Add(new Person() { Name= "Adam", Agen= 25});
            personList.Add(new Person() { Name= "Peter", Agen= 20});
    
            lstvwPerson.ItemsSource = personList;
    //After updates to the list use lstvwPerson.Items.Refresh();
        }
    }
    

    The XML

                
    

    RelativeSource is used in particular binding cases when we try to bind a property of a given object to another property of the object itself [1].

    Using Mode=FindAncestor we can traverse the hierarchy layers and get a specified element, for example the ListViewItem (we could even grab the GridViewColumn). If you have two ListViewItem elements you can specify which you want with "AncestorLevel = x".

    Path: Here I simply take the content of the ListViewItem (which is my object "Person").

    Converter Since I want to display row numbers in my Number column and not the object Person I need to create a Converter class which can somehow transform my Person object to a corresponding number row. But its not possible, I just wanted to show that the Path goes to the converter. Deleting the Path will send the ListViewItem to the Converter.

    ConverterParameter Specify a parameter you want to pass to the IValueConverter class. Here you can send the state if you want the row number to start at 0,1,100 or whatever.

    public class IndexConverter : IValueConverter
    {
        public object Convert(object value, Type TargetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //Get the ListViewItem from Value remember we deleted Path, so the value is an object of ListViewItem and not Person
            ListViewItem lvi = (ListViewItem)value;
            //Get lvi's container (listview)
            var listView = ItemsControl.ItemsControlFromItemContainer(lvi) as ListView;
    
            //Find out the position for the Person obj in the ListView
    //we can get the Person object from lvi.Content
            // Of course you can do as in the accepted answer instead!
            // I just think this is easier to understand for a beginner.
            int index = listView.Items.IndexOf(lvi.Content);
    
            //Convert your XML parameter value of 1 to an int.
            int startingIndex = System.Convert.ToInt32(parameter);
    
            return index + startingIndex;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

提交回复
热议问题