2011-01-28 6 views
8

devo impostare la vista listview ad un gridview che ha un'intestazione complesso come questo (basato su un elenco di oggetti 3 dimensionale ho creato):multilivello intestazione GridView WPF

| ---------- LEVEL 0 ------------ | 
| -- Level 1a -- | -- Level 1b -- | 
| Lvl A | Lvl B | Lvl A | Lvl B | 

EDIT: Questo è più minerale di meno il mio modello di oggetti

public class Measures 
{ 
    public string Caption { get; set; } 
    public List<Threshold> ThresholdList { get; set; } 
} 

public class Threshold 
{ 
    public string Caption { get; set; } 

    public double Value1 { get; set; } 
    public double Value2 { get; set; } 
    public double Value3 { get; set; } 
    public double Value4 { get; set; } 
} 

ho associare un elenco dinamico di Measures (questo è il mio livello 0), poi un elenco dinamico di Threshold (livello 1 bis ...) e per ogni values1 visualizzazione soglia 4 se lo sono! = 0

+0

Che ne dici di impilare più gridviewrowheaderpresenter? Potrebbe essere un buon modo? Sono bloccato in questo problema ... – michele

+0

Possiamo avere una migliore idea di come sono il tuo modello/dati oggetto? – RQDQ

+0

@RQDQ ho aggiunto l'oggetto che ho bisogno di visualizzare – michele

risposta

1

Che ne dite di qualcosa di simile:

<ListBox x:Name="MainListBox"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </Grid.RowDefinitions> 

         <Label Content="{Binding Path=Caption}" HorizontalAlignment="Center" /> 

         <ListBox Grid.Row="1" ItemsSource="{Binding Path=ThresholdList}" > 
          <ListBox.ItemsPanel> 
           <ItemsPanelTemplate> 
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch"> 
            </StackPanel> 
           </ItemsPanelTemplate> 
          </ListBox.ItemsPanel> 

          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Grid> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="Auto" /> 
              <RowDefinition Height="Auto" /> 
             </Grid.RowDefinitions> 

             <Label Content="{Binding Path=Caption}" HorizontalAlignment="Center" /> 

             <StackPanel Grid.Row="1" Orientation="Horizontal"> 
              <Label Content="{Binding Path=Value1}" /> 
              <Label Content="{Binding Path=Value2}" /> 
              <Label Content="{Binding Path=Value3}" /> 
              <Label Content="{Binding Path=Value4}" /> 
             </StackPanel> 
            </Grid> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 


         </ListBox> 

        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

potrebbe essere necessario convertire il Valore1, proprietà Value2 in una collezione per visualizzare dinamicamente quelli non nulli e utilizzare lo stesso approccio ListBox/StackPanel che ho usato per visualizzare le soglie.

Questo dà l'output:

Screenshot

E proprio per completare il post, ecco il codice che ho usato:

List<Measures> measuresList = new List<Measures>(); 

Measures measures = new Measures() 
{ 
    Caption = "LEVEL 0", 
    ThresholdList = new List<Threshold>() 
}; 

measures.ThresholdList.Add(new Threshold() 
{ 
    Caption = "Level 1a", 
    Value1 = 1, 
    Value2 = 2, 
    Value3 = 3, 
    Value4 = 4 
}); 

measures.ThresholdList.Add(new Threshold() 
{ 
    Caption = "Level 1b", 
    Value1 = 5, 
    Value2 = 6, 
    Value3 = 7, 
    Value4 = 8 
}); 

measuresList.Add(measures); 

this.MainListBox.ItemsSource = measuresList; 
+0

Grazie, sembra essere un buon suggerimento, ci proverò al più presto! Il mio unico dubbio è che ho bisogno di usare una vista elenco perché il modello oggetto che ho scritto finora viene ripetuto per una riga n (che rappresenta n membro). Ora sto usando una soluzione più semplice (perché le scadenze del progetto non aspettano), ma sto ancora cercando una soluzione più elegante! – michele

+0

@michele: questo approccio funziona ancora per più oggetti di misura e più oggetti Soglia. È questo che stai cercando di risolvere? – RQDQ

+0

Provo il tuo esempio di codice. Funziona, ma ho bisogno di impostare quella struttura ad albero sull'intestazione di un listview, le righe in listview devono visualizzare solo i valori di livello inferiore. Il tuo esempio imposta l'albero all'interno di ogni riga e sto cercando di evitarlo. Sto pensando che l'unica soluzione è scrivere un controllo personalizzato completo. Grazie ancora – michele

0

Livello 0 È un controllo ListView? Il livello 1A e il livello 1b sono Gridviews che desideri all'interno di due colonne con modelli diversi all'interno del livello 0 Visualizzazione elenco? Quindi il livello A e il livello b sono altre due viste della griglia all'interno di altre 2 colonne con modelli nel livello 1a e nel livello 1b?

Potreste essere in grado di convertire lo stesso concetto questo nidificato GridView utilizza in WPF

http://forums.asp.net/t/1071521.aspx

non l'ho provato io stesso in WPF, ma GridView sembrava essere costruita in modo simile. Basta usare i pannelli al posto di Div, e meno mal di testa con dover parlare delle chiamate client/server.

Anche gli insiemi di dati funzionano meglio delle liste.

Ecco il codice pseudo su come ho impostato i set di dati nidificati prima

DataSet ds1 = new DataSet(); 
     ds1.Tables.Add(m_DataLayer.GetRealA_Data(X, Y).Copy()); Returns Table ["A"] 
     ds1.Tables.Add(m_DataLayer.GetB_Empty().Copy());// Returns Table ["B"] 
     ds1.Tables.Add(m_DataLayer.GetC_Empty().Copy());// Returns Table ["C"] 
     ds1.Tables.Add(m_DataLayer.GetD_Empty().Copy());// Returns Table ["D"] 

     ds1.Relations.Add("b", ds1.Tables["A"].Columns["A_id"], ds1.Tables["B"].Columns["A_id"]); 
     ds1.Relations.Add("c", ds1.Tables["B"].Columns["B_id"] 
      , ds1.Tables["C"].Columns["B_id"]); 
     ds1.Relations.Add("d", ds1.Tables["C"].Columns["C_id"] 
      , ds1.Tables["D"].Columns["D_id"]); 

     dt_TheGridViewDataSet = ds1; 
     TheGridView.DataSource = ds1; 
+0

Grazie mille per il suggerimento. Sfortunatamente, lavorare con le gridview nidificate non sembra essere la soluzione per il mio problema. Ho bisogno di avere solo un listview, che mostri il livello più basso (lvl A, lvlB): i livelli superiori sono solo descrittivi, ho bisogno che sappiano a quale oggetto si riferisce lvlA ect. – michele

0

Avete pensato a come si dovrà comportare - l'intestazione questo è?

È abbastanza facile creare un'intestazione simile a quella che si suggerisce - è possibile crearla con alcune griglie in modo programmatico - ma questa è solo l'intestazione. Dovresti essere in grado di ridimensionarlo come puoi normalmente con un header listview?

Forse stai cercando qualcosa come TreeListView?

http://www.codeproject.com/KB/WPF/TreeListView.aspx

penso che è quello che vorrei andare dopo per visualizzare i dati multidimensionale - è facile da capire e da usare, in cui un listview personalizzato può essere difficile da implementare a comportarsi bene.

+0

grazie per il suggerimento. Quando ho del tempo libero voglio provare quel controllo! – michele