我的问题是如何将List<Object>
(其中包含List<String>
)绑定到WPF中的DataGrid
让我们说班级看起来像这样
Class Student
{
String Name;
List<String> Marks;
}
假设我有List<Student>
,但我如何将其绑定到数据源中的数据网格。
我确信这一点,DataGrid.DataSource=List<Student>
无法按预期工作。
这就是我想要的方式
答案 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; }
}
注意我为你的变量做了公共属性
结果
变量列
您可以拥有可变数量的列,但不能为每行
method1对xaml中的最大列进行硬编码,因此如果某列没有该行的值,它将保持为空
例如
我添加了另一栏以清楚地展示
<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>