2016-01-25 64 views
2

我有一个名为dataGrid的数据网格的WPF项目。为什么一个lamba表达式与运算符工作,而不是其他

我正在做一些测试,看看lambda表达式和运算符是如何工作的。

这里是我的表tUsers我拥有的数据:

enter image description here

而且我不明白为什么这样的:

this.dataGrid.ItemsSource = (from em in context.tUsers 
          select new { em.name }).ToList(); 

这将工作,并显示在正确的名称数据网格。它看起来像这样: enter image description here

但是,如果我在本教程不喜欢上.codeproject.com

this.dataGrid.ItemsSource = (from em in context.tUsers 
          select em.name).ToList(); 

这将只是显示一些整数,而不是名字。我不知道为什么。 enter image description here

所以我想第一个将创建一个匿名对象,并把em.name里面。但我不明白一个人会工作,而不是另一个。

我特别感兴趣的是它为什么显示这些整数。

无论如何解释?

PS:我只注意到整数实际上是字符串的长度。我不知道为什么。

+0

没有使用WPF,但我会想象源是寻找一个属性'name'的对象,如果没有找到,默认是别的东西(可能是索引?)。无论如何,你所拥有的陈述彼此非常不同。 – Rob

回答

1

网格显示了您传递给它的可枚举类型的每个非索引器属性的列。

在第一种情况下,您传递一个匿名类型的列表,它具有一个name属性,它是一个字符串,因此它显示一个名为name的列,并显示这些字符串。

在第二种情况下,您传递字符串列表,而字符串只有一个Length属性,因此它会创建一个名为Length的列,并显示这些长度。

0
this.dataGrid.ItemsSource = (from em in context.tUsers 
         select em.name).ToList(); 

这将返回一个字符串列表,而另一个将选择一个匿名类型列表,并带有name属性。

它显示每个字符串的长度,为什么它默认为这种行为,我不知道。

1

你混合2个语法:

this.dataGrid.ItemsSource = (from em in context.tUsers 
         select new { em.name }).ToList(); 

它将创建的字符串列表(即你正在寻找的名称)

而且这样的:

this.dataGrid.ItemsSource = (from em in context.tUsers 
         select em).ToList(); 

它将创建您的对象“员工”列表。

编辑: 默认情况下,DataGrid会自动从给定的item类中生成列,所以它会在String类中搜索它可以转换为列的属性。所以在这里,它显示了string.Length。 因此,您需要创建自己的列并关闭AutoGenerateColumns。示例:

<DataGrid Name="MainGrid" ... AutoGenerateColumns="False" ItemsSource="{Binding}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="name" Binding="{Binding}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

寻找投影算子。 – dyesdyes

+0

请检查我的编辑。 –

相关问题