特殊情况下会遇到做一个带有动态列的DataGrid(比如前面几列固定 后面列数不固定),这里用一个第一列固定,column1往后不确定作为示例简单记录一下。
首先给一个字符串数组(也有可能是复杂的类集合,这里简单地以数组为例):
private static string[] dynamicColumns;
DataGrid将以这个数组的元素个数,自动生成列,并绑定数据。
再来给数组赋一下值:
dynamicColumns = new string[6] { "Column1", "Column2", "Column3", "Column4", "Column5", "Column6" };//假设6列
前端给一个DataGrid:
<DataGrid x:Name="grid" ItemsSource="{Binding}" AutoGenerateColumns="False"></DataGrid>
接下来用一个例子来模拟测试一下:
首先创建一个实体类,作为datagrid的每行数据类型:
public class NewTestItem
{
private string idOrDescription;
public string IdOrDescription
{
get { return idOrDescription; }
set
{
idOrDescription = value;
}
}
private string column1;
public string Column1
{
get { return column1; }
set { column1 = value; }
}
private string column2;
public string Column2
{
get { return column2; }
set { column2 = value; }
}
private string column3;
public string Column3
{
get { return column3; }
set { column3 = value; }
}
private string column4;
public string Column4
{
get { return column4; }
set { column4 = value; }
}
private string column5;
public string Column5
{
get { return column5; }
set { column5 = value; }
}
}
根据dynamicColumns数组生成这个datagrid:
private void GenerateGrid(object obj)
{
object[] array = (object[])obj;
grid = array[0] as DataGrid;
var columnIdOrDescription = new DataGridTextColumn();
columnIdOrDescription.Header = "Project";
columnIdOrDescription.Binding = new Binding("IdOrDescription");
columnIdOrDescription.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
columnIdOrDescription.CellStyle = null;
grid.Columns.Add(columnIdOrDescription);
for (int i = 0; i < dynamicColumns.Length; i++)
{
var column = new DataGridTextColumn();
column.Header = dynamicColumns[i];
column.Binding = new Binding(dynamicColumns[i]);
column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
grid.Columns.Add(column);
}
grid.SetBinding(DataGrid.ItemsSourceProperty,"Items");
}
完整的代码地址