7

我有一个

List<DetailObject> someList;

看起来像这样:

    public class DetailObject
    {
        public string Titel { get; set; }
        public int Value1 { get; set; }
        public int Value2 { get; set; }
        public int Value3 { get; set; }
    }

有谁知道我如何使用(使用 DataGrid.AutoGenerateColumns="True")'string Titel' 的值作为 RowHeader 和其他成员作为“Row”内容?没有任何修改,它将显示“Titel”作为 ColumnHeader,Titel 的值显示为行,“Value1”的 dito 显示为 ColumnHeader,Value1 的值显示为 Rows 等。

谢谢你的帮助!

干杯

编辑:为了更好地理解,这就是我所拥有的

[Titel]       [Value1]       [Value2]       [Value3]
[Item1.Titel] [Item1.Value1] [Item1.Value2] [Item1.Value3] 
[Item2.Titel] [Item2.Value1] [Item2.Value2] [Item2.Value3] 
[Item3.Titel] [Item3.Value1] [Item3.Value2] [Item3.Value3] 

这就是我要找的:

[Item1.Titel]  [Item2.Titel]  [Item3.Titel] 
[Item1.Value1] [Item2.Value1] [Item3.Value1]
[Item1.Value2] [Item2.Value2] [Item3.Value2]
[Item1.Value3] [Item2.Value3] [Item3.Value3]

EDIT2:我在这里也找到了一个不错的方法:http: //codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

4

4 回答 4

5

这个线程有点旧,但也许有人仍然感兴趣......我也在寻找转置 WPF DataGrid 的方法,最后我在 CodePlex 上找到了以下开源项目:

转置的 WPF 数据网格

希望这可以帮助。

于 2012-07-13T13:26:17.647 回答
4

你可以RowHeaderTemplate这样使用:

<toolkit:DataGrid>
  <toolkit:DataGrid.RowHeaderTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Item.Titel, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type toolkit:DataGridRow}}}"/>
    </DataTemplate>
  </toolkit:DataGrid.RowHeaderTemplate>
</toolkit:DataGrid>

您还必须设置AutoGenerateColumnsfalse创建自己的列,以避免该Titel属性也显示为列。

编辑

我现在明白你想要转置DataGrid. 我认为简单但有点“hacky”的解决方案是创建一个“转置”对象的列表。为此,您必须事先知道原始列表中有多少对象,然后创建一个具有与对象一样多的属性的新类。

class TransposedDetailObject {
  public String Column1 { get; set; }
  public String Column2 { get; set; }
  public String Column3 { get; set; }
}

var transposedList new List<TransposedDetailObject> {
  new TransposedDetailObject {
    Column1 = someList[0].Titel,
    Column2 = someList[2].Titel,
    Column3 = someList[3].Titel
  },
  new TransposedDetailObject {
    Column1 = someList[0].Value1,
    Column2 = someList[2].Value1,
    Column3 = someList[3].Value1
  },
  ...
};

一个不那么“hacky”的解决方案是修改控制模板DataGrid以交换行和列。但是,DataGrid它是一个复杂的控件,修改控件模板可能会有点不知所措。

于 2009-09-24T13:08:57.500 回答
3

将业务对象列表转换为数据表,您已在其中从对象的属性创建列并将其设置为数据网格的 itemsource。如果要启用编辑,则必须迭代数据表并将值手动应用回业务对象。反射可能有助于使网格通用。只是一些想法。

于 2009-10-30T22:33:26.350 回答
1

我认为更干净的方法是使用ItemsControl而不是DataGrid用于您的场景。

按照此博客文章中的说明创建您自己的内容ItemTemplate,以获得最大程度的控制。这样,您可以为每列创建一个模板(可以是 Datagrid 本身)。

于 2013-04-23T06:39:36.707 回答