如何使用List(Of T)作为WPF DataGrid的Itemssource?

GST*_*STD 6 wpf datagrid list visual-studio-2010

我想快速在DataGrid中显示一个List(OF String)(动态),所以我想

myDataGrid.ItemsSource = myList
Run Code Online (Sandbox Code Playgroud)

这将是一种快速简便的方法,因为它适用于DataTable:

myDataGrid.ItemsSource = myDataTable.DefaultView
Run Code Online (Sandbox Code Playgroud)

我的DataGrid将AutoGenerateColumns属性设置为"True".对于数据表,这可以正常工作,但是当我将List(Of String)分配给ItemsSource时,我的列名称显示为'Length',显示的数据是整数,它们是List中每个String项中的字符数,而不是实际的String项.

我究竟做错了什么?

编辑

我的测试列表是这样创建的:

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

以下两种方法产生完全相同的结果.

创建一个CollectionView:

Dim cv = CType(CollectionViewSource.GetDefaultView(myList), CollectionView)
DataGrid1.ItemsSource = cv
Run Code Online (Sandbox Code Playgroud)

只需使用List:

DataGrid1.ItemsSource = myList
Run Code Online (Sandbox Code Playgroud)

这两种方法都在DataGrid中显示单个列.该列标题为"长度",包含与每个字符串条目的长度匹配的整数.

编辑

'testalino'对VB的回答:

DataGrid1.ItemsSource = myList.Select(Function(s) New With {.Value = s}).ToList
Run Code Online (Sandbox Code Playgroud)

tes*_*ino 4

你的例子其实很有趣。您正在将字符串类型的元素绑定到网格。然后,网格查找它可以显示的String类型的属性。找到的唯一属性是 Length,因此它创建一个名为 Length 的列并显示其值。

为避免这种情况,您需要做的是为字符串创建一个包装类。

要么显式创建一个类:

class StringWrapper
{
     string Value { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

或者使用 LINQ:

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

希望这可以帮助。