是否可以将包含List <string>的List <object>绑定到DataGrid </string> </object>

时间:2014-06-23 06:00:14

标签: c# wpf datagrid

我的问题是如何将List<Object>(其中包含List<String>)绑定到WPF中的DataGrid

让我们说班级看起来像这样

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

假设我有List<Student>,但我如何将其绑定到数据源中的数据网格。

我确信这一点,DataGrid.DataSource=List<Student>无法按预期工作。

这就是我想要的方式

enter image description here

4 个答案:

答案 0 :(得分:5)

你去吧

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

也将类更改为

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

注意我为你的变量做了公共属性

结果

sample

变量列

您可以拥有可变数量的列,但不能为每行

method1对xaml中的最大列进行硬编码,因此如果某列没有该行的值,它将保持为空

例如

grid sample 2

我添加了另一栏以清楚地展示

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

其他方法涉及在运行时通过代码隐藏或通过附加属性的帮助生成列

答案 1 :(得分:2)

你必须使用以下的分期付款代码

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


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

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

并且您的Itemsource看起来像

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

答案 2 :(得分:2)

你可以这样尝试

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

如果你不想在列表中显示标记并且你有固定的标记数,你可以这样做

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

答案 3 :(得分:1)

首先,您需要拥有公共属性而不是模型中的字段。像那样:

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

然后为网格提供datacontext。在后面的代码中添加类似的东西:

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

最后一件事是将DataContext绑定到xaml中的控件。和其他答案一样:

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