Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以绑定列表<;对象>;其中包含列表<;字符串>;到数据网格_C#_Wpf_Datagrid - Fatal编程技术网

C# 是否可以绑定列表<;对象>;其中包含列表<;字符串>;到数据网格

C# 是否可以绑定列表<;对象>;其中包含列表<;字符串>;到数据网格,c#,wpf,datagrid,C#,Wpf,Datagrid,我的问题是如何将列表(其中包含列表)绑定到WPF中的数据网格 让我们假设这个班级看起来像这样 Class Student { String Name; List<String> Marks; } <DataGrid ItemsSource="{Binding lstStu}"> <DataGrid.Columns> <DataGridTextColumn Hea

我的问题是如何将
列表
(其中包含
列表
)绑定到WPF中的数据网格

让我们假设这个班级看起来像这样

Class Student
{
         String Name;
         List<String> Marks;
}
<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]}"/>
班级学生
{
字符串名;
列表标记;
}
假设我有
列表
,但如何将其绑定到数据源中的数据网格

我确信这个,
DataGrid.DataSource=List
不会像预期的那样工作

这就是我想要的


您必须使用以下代码

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


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

    public ObservableCollection<Student> student
    {
        get { return _student; }
        set { _student = value; }
    }
班级学生
{
字符串名;
列表标记;
}
private ObservableCollection_student=新ObservableCollection();
公选学生
{
获取{return\u student;}
设置{u student=value;}
}
你的Itemsource看起来像

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

你可以这样试试

Class Student
{
         String Name;
         List<String> Marks;
}
<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]}"/>

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

Class Student
{
         String Name;
         List<String> Marks;
}
<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]}"/>

给你


也可以将类更改为

    class Student
    {
        public String Name { get; set; }
        public List<String> Marks { get; set; }
    }
班级学生
{
公共字符串名称{get;set;}
公共列表标记{get;set;}
}
注意,我公开了变量的属性

结果

变量列

您可以拥有可变的列数,但不能针对每一行

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

乙二醇

我已经添加了另一个专栏来清楚地演示

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


其他方法包括在运行时通过代码隐藏或通过附加属性的帮助生成列。首先,您需要在模型中使用公共属性,而不是字段。就像这样:

public class Student
{
         public String Name {get;set;}
         public List<String> Marks {get;set;}
}
公共班级学生
{
公共字符串名称{get;set;}
公共列表标记{get;set;}
}
然后为网格提供datacontext。在代码隐藏中添加如下内容:

var StudentsList = new List<Student>();
//populate the list.....    
DataContext=StudentsList;
var StudentsList=new List();
//填充列表。。。。。
DataContext=StudentsList;
最后一件事是将DataContext绑定到xaml中的控件。就像其他答案一样:

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


您希望显示哪些学生的分数??我的问题你想绑定当前所选学生的分数吗?我在列表对象中有5个学生,每个学生有5个科目分数。你想同时显示所有学生及其姓名,还是基于任何选择显示任何学生的分数???你不能。DataGrid的源是一个列表(二维)。您可以使用listview并在其中创建DataGrid。将列表绑定到listview并将标记绑定到DataGrid。@SivasBramanian不,所有学生都可以。它会扩展列表并将其放入列中吗?抱歉,我收到了。但这只适用于一个学生,那么列表呢?写一个列表来代替分数可能会发生变化。不一定总是三分我希望每个学生都有相同的分数?如果没有,那么您是否希望在空白处看到空白或0?如果您知道最大标记数列,您可以简单地定义所有标记,或者您可以在代码隐藏中生成列,或者使用附加属性行为来更好地控制。是的,每个学生都会有相同的标记。它只能在代码隐藏中完成,还是可以在xaml本身中完成?xaml可能无法单独完成,因为标记是一种集合类型,如果需要,那么您可能必须为学生类定义一些属性描述符,以便xaml能够发现属性?您更喜欢这种方法吗?是的,我认为在xaml中会很好。不幸的是,这不起作用。datagrid显示一个名为“Marks”的列,但行中显示“Collection”。