C # / WPF: DataGrid Toolkit - transponer filas y columnas
-
16-09-2019 - |
Pregunta
Tengo un
List<DetailObject> someList;
que tiene este aspecto:
public class DetailObject
{
public string Titel { get; set; }
public int Value1 { get; set; }
public int Value2 { get; set; }
public int Value3 { get; set; }
}
¿Alguien sabe cómo puedo usar (con DataGrid.AutoGenerateColumns = "true") el valor de la 'cadena de Titel' como RowHeader y otros miembros como contenido "Fila"? Sin ningún tipo de modificaciones, que va a muéstreme "Título", como ColumnHeader y el valor de Titel como fila, para dito "Valor1" como ColumnHeader y el valor (s) de Valor1 como filas etc.
Gracias por cualquier ayuda!
Saludos
EDIT: Para una mejor comprensión, esto es lo que tengo
[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]
y esto es lo que estoy buscando:
[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: He encontrado también un acercamiento agradable aquí: http://codemaverick.blogspot.com/2008/02 /transpose-datagrid-or-gridview-by.html
Solución
Puede utilizar RowHeaderTemplate
como esto:
<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>
También tendrá que establecer AutoGenerateColumns
a false
y crear sus propias columnas para evitar la propiedad Titel
también se muestra como una columna.
Editar
Ahora entiendo que desea transponer la DataGrid
. Creo que la solución fácil, pero un poco "hacky" es crear una lista de objetos "transposición". Para ello tendría que saber de antemano cuántos objetos hay en la lista original y luego crear una nueva clase con todas las propiedades que hay 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
},
...
};
Una solución menos "hacky" es modificar la plantilla de control de la DataGrid
para intercambiar filas y columnas. Sin embargo, DataGrid
es un control complejo y puede ser un poco abrumador para modificar la plantilla de control.
Otros consejos
Este hilo es un poco viejo, pero tal vez alguien todavía está interesada ... Yo también estaba buscando una manera de incorporar WPF DataGrid y finalmente encontró el siguiente proyecto de código abierto en CodePlex:
Espero que esto ayude.
Convertir la lista de objetos de negocio a una tabla de datos en la que han creado las columnas de las propiedades de su objeto y establecer que a medida que ItemSource de su cuadrícula de datos. Si desea habilitar la edición, a continuación, tendrá que recorrer la tabla de datos y de forma manual aplicar los valores de nuevo a sus objetos de negocio. reflexión puede ayudar a que la red genérica. sólo algunos pensamientos.
Creo enfoque más limpia es utilizar ItemsControl
en lugar de DataGrid
para su escenario.
Siga las instrucciones de esta entrada de blog y crear su propio ItemTemplate
para un control máximo. De esta manera, se puede crear una plantilla para cada columna (que puede ser una cuadrícula de datos en sí).