C # / WPF: Toolkit DataGrid - linhas e colunas Transposição
-
16-09-2019 - |
Pergunta
Eu tenho um
List<DetailObject> someList;
que tem esta aparência:
public class DetailObject
{
public string Titel { get; set; }
public int Value1 { get; set; }
public int Value2 { get; set; }
public int Value3 { get; set; }
}
Alguém sabe como posso usar (com DataGrid.AutoGenerateColumns = "True") o valor de 'Titel string' como RowHeader e outros membros como conteúdo "Row"? Sem qualquer modificação, ele vai me mostrar "Titel" como ColumnHeader e o valor de Titel como linha, dito de "Value1" como ColumnHeader e o valor (es) de Value1 como linhas etc.
Obrigado por qualquer ajuda!
Felicidades
EDIT: Para melhor compreensão, isso é o que eu tenho
[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]
e é isso que eu estou procurando:
[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: Eu também achei uma abordagem agradável aqui: http://codemaverick.blogspot.com/2008/02 /transpose-datagrid-or-gridview-by.html
Solução
Você pode usar RowHeaderTemplate
assim:
<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>
Você também terá que definir AutoGenerateColumns
para false
e criar suas próprias colunas para evitar a propriedade Titel
também está sendo exibido como uma coluna.
Editar
Agora eu entendo que você deseja transpor a DataGrid
. Acho que a solução fácil, mas um pouco "hacky" é criar uma lista de objetos "transpostas". Para fazer isso você teria que saber antecipadamente quantos objetos existem na lista original e, em seguida, criar uma nova classe com tantas propriedades como existem objetos.
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
},
...
};
A menos solução "hacky" é modificar o modelo do DataGrid
controle para linhas e colunas de swap. No entanto, DataGrid
é um controle complexo e pode ser um pouco esmagadora para modificar o modelo de controle.
Outras dicas
Esta discussão é um pouco antiga, mas talvez alguém ainda está interessado ... Eu também estava procurando maneira de transpor uma WPF DataGrid e, finalmente, eu encontrei o seguinte projeto de código aberto no CodePlex:
Espero que isso ajude.
Converter a lista de objetos de negócios em uma tabela de dados onde você criou as colunas de propriedades do seu objeto e defina-o como o seu datagrid é ItemSource. Se você deseja ativar a edição, então você vai ter que iterar a tabela de dados e manualmente aplicar os valores de volta para seus objetos de negócios. reflexão pode ajudar a tornar a grade genérico. Apenas alguns pensamentos.
Eu acho abordagem mais limpa é usar ItemsControl
vez de DataGrid
para seu cenário.
Siga as instruções na este post e criar seu próprio ItemTemplate
para o máximo controle. Dessa forma, você pode criar um modelo para cada coluna (que pode ser um si Datagrid).