Pregunta ¿Es posible vincular una Lista que contiene Lista a DataGrid


Mi pregunta es cómo atar un List<Object> (Que contiene un List<String> ) a un DataGrid en WPF

Digamos que la clase se ve así

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

Digamos que tengo List<Student> pero ¿cómo puedo enlazar esto a una cuadrícula de datos en el origen de datos.

Estoy seguro de esto DataGrid.DataSource=List<Student> no funcionaría como se esperaba

Así es como quiero

enter image description here


5
2018-06-23 06:00


origen


Respuestas:


aqui tienes

    <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>

también cambia de clase como

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

nota que hice propiedades públicas para sus variables

resultado

sample

Columnas variables

puede tener un número variable de columnas pero no para cada fila

método1 código máximo columnas máximas en xaml, por lo que si una columna no tiene un valor para esa fila, permanecerá vacía

p.ej

grid sample 2

He agregado otra columna para demostrar claramente

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

otro enfoque implica generar columnas en tiempo de ejecución a través de código detrás o mediante la ayuda de propiedades adjuntas


5
2018-06-23 06:22



tienes que usar el siguiente código menionado

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


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

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

y su Itemource se ve como

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

2
2018-06-23 06:02



puedes intentar así

<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>

si no desea mostrar la marca en la lista y ha fijado el número de marca, puede hacerlo así

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

2
2018-06-23 06:12



En primer lugar, debe tener propiedades públicas en lugar de campos en su modelo. Como eso:

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

Luego proporcione datacontext para la grilla. En el código detrás, agrega algo como eso:

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

Lo último es vincular el DataContext a los controles en xaml. Como en las otras respuestas:

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

1
2018-06-23 06:22