Как использовать список (из T) в качестве Itemssource для WPF DataGrid?

Я хотел быстро отобразить список (строки) в DataGrid (динамически), поэтому я подумал

myDataGrid.ItemsSource = myList

был бы быстрый и простой способ сделать это, так как это отлично подходит для DataTable:

myDataGrid.ItemsSource = myDataTable.DefaultView

мой DataGrid имеет свойство AutoGenerateColumns значение "True". И для datatable это отлично работает, но когда я назначаю список (строки) ItemsSource, мое имя столбца отображается как "длина" , а отображаемые данные-это целые числа символов в каждом элементе строки в списке, а не фактический элемент строки.

что я делаю не так?

редактировать

мой список тестов создается так:

Dim myList As New List(Of String)
  For i As Int32 = 1 To 25
  myList.Add("Item #" & i)
Next

следующие 2 метода дают одинаковые результаты.

создайте CollectionView:

Dim cv = CType(CollectionViewSource.GetDefaultView(myList), CollectionView)
DataGrid1.ItemsSource = cv

просто используйте список:

DataGrid1.ItemsSource = myList

оба этих метода отображают один столбец в DataGrid. Столбец называется "длина" и содержит целые числа, соответствующие длине каждой Строковой записи.

редактировать

Перевод ответа "testalino" на VB:

DataGrid1.ItemsSource = myList.Select(Function(s) New With {.Value = s}).ToList

1 ответов


ваш случай на самом деле смешной. Вы привязываете элементы типа string к сетке. Затем сетка ищет свойства в типе строка что он может показать. единственное найденное свойство-Length, поэтому оно создает столбец с именем Length и отображает его значение.

что вам нужно сделать, чтобы избежать этого, это создать класс-оболочку для string.

либо создайте класс явно:

class StringWrapper
{
     string Value { get; set;}
}

или с помощью LINQ:

List<string> strings = new List<string>();
strings.Add("abc");
strings.Add("def");
dataGrid.ItemsSource = strings.Select(s => new { Value = s }).ToList();

надеюсь, что это помогает.