2014-06-23 11 views
5

La mia domanda è come associare un List<Object> (che contiene un List<String>) per un DataGrid in WPFE 'possibile associare un elenco <Object> che contiene Lista <String> al DataGrid

Diciamo che la classe si presenta così

Class Student 
{ 
     String Name; 
     List<String> Marks; 
} 

Diciamo che ho List<Student> ma come collegarlo a una griglia di dati nell'origine dati.

Sono sicuro che questo, DataGrid.DataSource=List<Student> non funzionerebbe come previsto.

è così che voglio

enter image description here

+0

Quali marchi dello studente vuoi mostrare? La mia domanda vuoi legare il voto dello studente selezionato? – Sivasubramanian

+0

Ho 5 studenti nell'oggetto Elenco e ciascuno con 5 segni di soggetto. –

+0

Vuoi mostrare tutti gli studenti e questi nomi allo stesso tempo o il voto di uno studente in base a qualsiasi selezione ??? – Sivasubramanian

risposta

5

qui si va

<DataGrid ItemsSource="{Binding Students}" 
       AutoGenerateColumns="False" 
       CanUserAddRows="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Name}" 
           Header="Name" /> 
      <DataGridTextColumn Binding="{Binding Marks[0]}" 
           Header="Mark1" /> 
      <DataGridTextColumn Binding="{Binding Marks[1]}" 
           Header="Mark2" /> 
      <DataGridTextColumn Binding="{Binding Marks[2]}" 
           Header="Mark3" /> 
     </DataGrid.Columns> 
    </DataGrid> 

cambiano anche di classe come

class Student 
    { 
     public String Name { get; set; } 
     public List<String> Marks { get; set; } 
    } 

nota che ho fatto le proprietà pubbliche per le variabili

risultato

sample

colonne variabili

è possibile avere un numero variabile di colonne, ma non per ogni riga

colonne method1 codificare massimi xaml, quindi se una colonna non ha un valore per quella riga rimarrà vuoto

ad es.

grid sample 2

Ho aggiunto un'altra colonna di dimostrare chiaramente

<DataGridTextColumn Binding="{Binding Marks[3]}" 
        Header="Mark4" /> 

altro approccio coinvolgono generare colonne in fase di esecuzione tramite codice dietro o tramite ausilio di proprietà associate

+0

Il numero di segni potrebbe cambiare. Non sempre i tre punti sempre –

+0

spero che ogni studente abbia lo stesso numero di voti? se no allora ti aspetti di vedere spazi vuoti o 0 nel posto vuoto? Se conosci la colonna numero massimo di contrassegni puoi semplicemente definire tutto o forse potresti generare le colonne nel codice sottostante o utilizzando il comportamento delle proprietà associate per un controllo migliore. – pushpraj

+0

Sì, ogni studente avrà gli stessi voti. Può essere fatto solo nel codice o esiste un modo per farlo in xaml? –

2

è necessario utilizzare sottostante Codice menioned

Class Student 
{ 
     String Name; 
     List<String> Marks; 
} 


private ObservableCollection<Student> _student=new ObservableCollection<Student>(); 

    public ObservableCollection<Student> student 
    { 
     get { return _student; } 
     set { _student = value; } 
    } 

e la tua ItemSource guarda come

<DataGrid ItemsSource="{Binding student}"> 
     <DataGrid.ItemTemplate> 
      <DataTemplate> 
       <DataGrid ItemsSource="{Binding Marks}"></DataGrid> 
      </DataTemplate> 
     </DataGrid.ItemTemplate> 
    </DataGrid> 
+0

Espandera la lista e metterlo nelle colonne? –

+0

non si ottiene quello che hai detto –

+0

Scusa, ho capito. Ma questo funzionerà solo per uno studente e per quanto riguarda una lista ? –

2

si può provare in questo modo

<DataGrid ItemsSource="{Binding lstStu}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="name" Binding="{Binding Name}"/> 
       <DataGridTemplateColumn Header="list"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ListBox ItemsSource="{Binding Marks}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

se non si desidera visualizzare segno nella lista e si è fissato il numero di contrassegno, si può fare in questo modo

<DataGridTextColumn Header="name" Binding="{Binding Name}"/> 
<DataGridTextColumn Header="mark1" Binding="{Binding Marks[0]}"/> 
<DataGridTextColumn Header="mark2" Binding="{Binding Marks[1]}"/> 
1

Nel primo posizionare è necessario disporre di proprietà pubbliche anziché di campi nel modello.In questo modo:

public class Student 
{ 
     public String Name {get;set;} 
     public List<String> Marks {get;set;} 
} 

Quindi fornire il datacontext per la griglia. Nel codice dietro aggiungere qualcosa di simile:

var StudentsList = new List<Student>(); 
//populate the list.....  
DataContext=StudentsList; 

L'ultima cosa è quello di legare il DataContext ai controlli in XAML. Come nelle altre risposte:

<ListView ItemsSource="{Binding StudentsList}"> 
     <ListView.ItemTemplate> 
       <DataTemplate> 
         <DataGrid ItemsSource="{Binding Marks}" /> 
       </DataTemplate> 
     </ListView.ItemTemplate> 
</ListView> 
Problemi correlati