Как использовать List (Of T) как Itemssource для WPF DataGrid? - PullRequest
6 голосов
/ 20 октября 2010

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

myDataGrid.ItemsSource = myList

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

myDataGrid.ItemsSource = myDataTable.DefaultView

Мой DataGrid имеет свойство AutoGenerateColumns, установленное в значение «True». И для datatable это работает нормально, но когда я назначаю List (Of String) для ItemsSource, имя моего столбца отображается как «Length», и отображаемые данные представляют собой целые числа, которые являются количеством символов в каждом элементе String в List , а не фактический строковый предмет.

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

EDIT

Мой список тестов создается следующим образом:

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. Столбец называется «Длина» и содержит целые числа, соответствующие длине каждой строковой записи.

EDIT

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

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

1 Ответ

4 голосов
/ 20 октября 2010

Ваш случай на самом деле смешной. Вы привязываете элементы типа string к сетке. Сетка затем ищет свойства типа 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();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...