C#/WPF: инструментарий DataGrid - транспонировать строки и столбцы

У меня есть

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" Content? Без каких-либо модификаций он покажет мне "Titel" в качестве ColumnHeader и значение Titel в качестве строки, dito для "Value1" в качестве ColumnHeader и значения (значений) Value1 в качестве строк и т. Д.

Спасибо за любую помощь!

ура

РЕДАКТИРОВАТЬ: Для лучшего понимания, это то, что у меня есть

[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]

РЕДАКТИРОВАТЬ 2: Я нашел также хороший подход здесь: http://codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

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>

Вам также придется установить AutoGenerateColumns в false и создать свои собственные столбцы, чтобы избежать Titel свойство также отображается в виде столбца.

редактировать

Теперь я понимаю, что вы хотите транспонировать DataGrid, Я думаю, что простое, но несколько "хакерское" решение - создать список "транспонированных" объектов. Для этого вам нужно заранее знать, сколько объектов в исходном списке, а затем создать новый класс с таким же количеством свойств, как и у объектов.

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

Менее "хакерское" решение состоит в том, чтобы изменить шаблон управления DataGrid поменять местами строки и столбцы. Тем не мение, DataGrid это сложный элемент управления, и может быть немного сложно изменить шаблон элемента управления.

Этот поток немного староват, но, возможно, кто-то все еще заинтересован... Я также искал способ транспонировать WPF DataGrid и, наконец, нашел следующий проект с открытым исходным кодом на CodePlex:

Транспонированная WPF DataGrid

Надеюсь это поможет.

Преобразуйте список бизнес-объектов в таблицу данных, в которой вы создали столбцы из свойств вашего объекта, и установите его в качестве источника элементов вашей таблицы данных. Если вы хотите включить редактирование, вам нужно будет выполнить итерацию данных и вручную применить значения обратно к вашим бизнес-объектам. отражение может помочь сделать сетку общей. только некоторые мысли.

Я думаю, что более чистый подход заключается в использовании ItemsControl вместо DataGrid для вашего сценария.

Следуйте инструкциям в этом блоге и создайте свой собственный ItemTemplate для максимального контроля. Таким образом, вы можете создать шаблон для каждого столбца (который может быть сам Datagrid).

Другие вопросы по тегам