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

时间:2010-10-20 10:28:19

标签: wpf visual-studio-2010 list datagrid

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

myDataGrid.ItemsSource = myList

将是快速简便的方法,因为这对DataTable非常有用:

myDataGrid.ItemsSource = myDataTable.DefaultView

我的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

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

创建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 个答案:

答案 0 :(得分:4)

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

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

明确创建一个类:

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();

希望这有帮助。