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