使用匿名类型集合在WPF中填充DataGrid

4
我正在使用匿名类型的集合来填充数据表格(我设置了DataGrid的DataContext属性),没有错误提示,但是数据表格中没有显示任何内容。我尝试使用定义好的对象集合,但同样没有显示任何内容。请问您能指导我该怎么做吗?
谢谢!
编辑1:好的。我尝试设置ItemsSource属性,它可以工作。但是结果很奇怪。
编辑2:我不知道为什么,在第三次启动后,它现在可以正常工作了?
private void ShowABCResultsButtonOnClick(Object sender, RoutedEventArgs e)
{
    var anonArray = new List<NormalizedResult> 
    { 
        new NormalizedResult
        { 
            Key = 1,
            Title = "Колос", 
            Volume = 1322.01m,
            Weighted = 6.7840m,
            Result = 6.7840m,
            Group = "A"
        },
        new NormalizedResult
        { 
            Key = 2,
            Title = "Украинский Новый", 
            Volume = 1250.47m,
            Weighted = 6.4169m,
            Result = 13.2009m,
            Group = "A"
        },
        new NormalizedResult
        { 
            Key = 3,
            Title = "Ржано-Пшеничный", 
            Volume = 1202.1m,
            Weighted = 6.1687m,
            Result = 19.3695m,
            Group = "A"
        }
    };

    this.dataGrid2.ItemsSource = anonArray;
}

这是我的代码。

我又运行了一次...但只有第三次才正确显示?




嗨,也许这个帖子可以帮到你。 - BumbleB2na
我甚至不确定那个截图显示了什么……你是把四条记录放到了ItemsSource属性里吗? - Tim
@Tim:我能够使用“AutoGenerateColumns = True”和匿名类型重新创建他的图片。这很可能是自动生成列的限制。 - user7116
3个回答

7
你可能需要做两件事情。第一件事,如@Tim所建议的那样,是将查询分配给DataGrid.ItemsSource属性。
myDataGrid.ItemsSource = from a in x
                         select new { Prop1 = a.A, Prop2 = a.B, ... };

第二个任务是在您的 DataGrid 上启用自动列生成:


第二个任务是为您的DataGrid启用自动列生成。
<DataGrid x:Name="myDataGrid"
          AutoGenerateColumns="True" />

编辑:我使用自动列生成和匿名类型以及普通的LINQ查询重新创建了您的图片。因此,您可以使用显式列或切换到真实类型。

<DataGrid x:Name="myDataGrid"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Property 1"
                            Binding="{Binding Prop1}"/>
        <DataGridTextColumn Header="Property 2"
                            Binding="{Binding Prop2}"/>
    </DataGrid.Columns>
</DataGrid>
编辑2:您可以使用AutoGenerateColumns="True",但不能与裸的IEnumerable<T>一起使用,其中T是匿名类型。通过添加ToList,问题就解决了。
myDataGrid.ItemsSource = (from m in typeof(int).GetMethods()
                          select new
                          {
                              Name = m.Name,
                              ReturnType = m.ReturnType.FullName
                          }).ToList();

XAML然后回到:

<DataGrid x:Name="myDataGrid"
          AutoGenerateColumns="True" />

Prop1代表什么?我应该分配确切的属性名称吗?如果是这样,我应该使用匿名对象分配什么? - lexeme
好的,我明白了关于属性的事情,我会尝试的。 - lexeme
@helicera:我稍微改了一下我的代码,这样匿名类型就可以在不需要显式声明列的情况下使用了。请看我的第二次修改。 - user7116
请问您能解释一下这个linq查询是做什么的吗?它会获取属性,例如PropName + PropRetType吗? - lexeme
@helicera:哎呀,这只是一个示例查询,根本不神奇。用你自己的查询替换所有内容,但在末尾添加.ToList() - user7116
是的,你说得对!我尝试了你建议的第一种方法,对我来说很有效。非常有帮助!谢谢! - lexeme

5
我相信你应该设置DataGrid的ItemsSource属性。

2
请确保在将匿名对象绑定到数据网格时使用相同的属性名称,并确保集合包含项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接