【问题标题】:Populating DataGrid in WPF with anonymous type collection使用匿名类型集合在 WPF 中填充 DataGrid
【发布时间】:2011-09-05 19:24:42
【问题描述】:

我正在使用匿名类型的集合填充数据网格(我正在设置 DataGrid's DataContext 属性)。并且没有错误。在数据网格中没有任何显示。我尝试对已定义的对象集合进行相同的操作,但又没有显示任何内容。请您指导我该怎么做。

谢谢!

编辑 1

好的。我试图设置 ItemsSource 属性并且它有效。但我得到了奇怪的结果..

编辑 2

我不知道如何,但在 3d 启动后,它现在可以正常工作了吗?

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;
}

这是我的代码。

我又启动了.. 只是第三次才正确显示?



【问题讨论】:

  • 嗨,也许this thread 会帮助你。
  • 我什至不确定该屏幕截图显示了什么...您是否将四条记录放入 ItemsSource 属性中?
  • @Tim:我能够使用AutoGenerateColumns="True" 和匿名类型重新创建他的照片。可能是自动生成列的限制。

标签: c# wpf datagrid datacontext anonymous-types


【解决方案1】:

很确定您应该设置 DataGrid 的 ItemsSource

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可能需要做两件事。第一个 as @Tim suggested 将查询分配给 DataGrid.ItemsSource 属性。

      myDataGrid.ItemsSource = from a in x
                               select new { Prop1 = a.A, Prop2 = a.B, ... };
      

      第二点是在您的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&lt;T&gt; 一起使用,其中 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 代表什么。我应该分配确切的属性名称。如果是我应该使用匿名对象分配什么?
      • 好的,我了解属性..我会尝试。
      • @helicera:我稍微更改了我的代码,以便可以使用匿名类型而无需显式声明您的列。请参阅我的第二次编辑。
      • 您能解释一下 linq 查询的作用吗?它是否获得属性,即 PropName + PropRetType?
      • @helicera:糟糕,这只是一个示例查询,一点也不神奇。用您自己的查询替换所有内容,但在末尾添加 .ToList()
      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2013-05-03
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多