C # / WPF: Toolkit DataGrid - recepire righe e colonne
-
16-09-2019 - |
Domanda
Ho un
List<DetailObject> someList;
che si presenta in questo modo:
public class DetailObject
{
public string Titel { get; set; }
public int Value1 { get; set; }
public int Value2 { get; set; }
public int Value3 { get; set; }
}
Qualcuno sa come posso usare (con DataGrid.AutoGenerateColumns = "true") il valore di 'stringa Titel' come RowHeader e gli altri membri come Content "Riga"? Senza alcuna modifica, che verrà visualizzato me "Titel" come ColumnHeader e il valore di Titel come fila, dito per "Value1", come ColumnHeader e il valore (s) di Valore1 come righe, ecc.
Grazie per qualsiasi aiuto!
Saluti
EDIT: Per una migliore comprensione, questo è quello che ho
[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 questo è quello che sto cercando:
[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: Ho trovato anche un approccio bello qui: http://codemaverick.blogspot.com/2008/02 /transpose-datagrid-or-gridview-by.html
Soluzione
È possibile utilizzare RowHeaderTemplate
in questo modo:
<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>
Sarà inoltre necessario impostare AutoGenerateColumns
per false
e creare le proprie colonne per evitare la proprietà Titel
anche essere visualizzato come una colonna.
Modifica
Ora capisco che si desidera trasporre la DataGrid
. Penso che la soluzione facile, ma un po ' "hacky" è quello di creare una lista di oggetti "trasposte". Per fare questo si dovrebbe sapere in anticipo quanti oggetti ci sono nella lista originale e quindi creare una nuova classe con il maggior numero di proprietà in quanto non vi sono oggetti.
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 soluzione meno "hacky" è quello di modificare il modello di controllo del DataGrid
per scambiare righe e colonne. Tuttavia, DataGrid
è un controllo complessa e può essere un po 'opprimente per modificare il modello di controllo.
Altri suggerimenti
Questo thread è un po 'vecchio, ma forse qualcuno è ancora interessato ... Sono stato anche alla ricerca di modo per trasporre una WPF DataGrid e alla fine ho trovato il seguente progetto open source su CodePlex:
Spero che questo aiuti.
Convertire l'elenco degli oggetti di business per un DataTable cui è stato creato le colonne dalle proprietà del vostro oggetto e impostarlo come ItemSource del datagrid. Se si desidera attivare la modifica, quindi dovrete scorrere DataTable e applicare manualmente i valori a oggetti di business. riflessione può contribuire a rendere la griglia generico. Solo alcuni pensieri.
Credo approccio più pulito è quello di utilizzare ItemsControl
invece di DataGrid
per lo scenario.
Seguire le indicazioni sulla questo post del blog e di creare il proprio ItemTemplate
per il massimo controllo. In questo modo, è possibile creare un modello per ogni colonna (che può essere un DataGrid stesso).