Вот еще один способ, включая комментарии к коду, которые помогут вам понять, как это работает.
public class Person
{
private string name;
private int age;
//Public Properties ....
}
public partial class MainWindow : Window
{
List<Person> personList;
public MainWindow()
{
InitializeComponent();
personList= new List<Person>();
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();
}
}
XML
<GridViewColumn Header="Number" Width="50"
DisplayMemberBinding="{
Binding RelativeSource= {RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}},
DELETE Path=Content, DELETE
Converter={StaticResource IndexConverter},
ConverterParameter=1
}"/>
RelativeSource используется в особых случаях привязки, когда мы пытаемся связать свойство данного объекта с другим свойством самого объекта [1] .
Используя Mode = FindAncestor , мы можем пройти по слоям иерархии и получить указанный элемент, например ListViewItem (мы могли бы даже получить GridViewColumn). Если у вас есть два элемента ListViewItem, вы можете указать, какой вы хотите, с помощью «AncestorLevel = x».
Путь : Здесь я просто беру содержимое ListViewItem (который является моим объектом "Person").
Converter Поскольку я хочу отображать номера строк в столбце Number, а не объект Person, мне нужно создать класс Converter, который может каким-то образом преобразовать мой объект Person в соответствующую строку номеров. Но это невозможно, я просто хотел показать, что Путь идет к конвертеру . Удаление пути отправит ListViewItem в конвертер.
ConverterParameter Укажите параметр, который вы хотите передать классу IValueConverter. Здесь вы можете отправить состояние, если хотите, чтобы номер строки начинался с 0,1,100 или как-то еще.
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();
}
}