如何动态创建DataGrid的DataGridTextColumn并绑定它?

时间:2015-11-25 13:23:14

标签: c# wpf xaml datagrid

我有两个属性:

  • public ObservableCollection<Object> HeaderOfDataGrid {get; set;}
  • public Observablecollection<Object> BodyOfDataGrid {get; set;}

是否可以将HeaderOfDataGrid属性绑定到DataGridTextColumn?是的,我知道通过这样绑定是可能的:

<DataGrid.Columns>
   <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
   <DataGridTextColumn Header="Surname" Binding="{Binding Surname}"/>
   <DataGridTextColumn Header="Phone" Binding="{Binding Phone_Number}" />
</DataGrid.Columns>

但是,HeaderOfDataGrid属性的'Count'可以等于700,我需要在HeaderOfDataGrid的{​​{1}}中显示所有700个集合DataGridTextColumns。所以,我需要根据DataGrid属性(集合)创建700 DataGridTextColumns。此外,如果HeaderOfDataGrid属性的Count为700,则HeaderOfDataGrid属性也具有相同的BodyOfDataGrid(例如,700)。所以使用硬编码Count对我来说不方便。

我知道我可以用这种方式绑定:

xaml

但它不是我想要的,因为我想重命名位于Header属性中的标题。

如何在没有硬编码<DataGrid ItemsSource="{Binding Path=Body, Mode=TwoWay}"/> xaml的情况下实施绑定和创建?

2 个答案:

答案 0 :(得分:0)

你不能双管齐下。 如果要重命名标题,则必须手动编写代码;否则你会自动执行它并使用它给你的东西。

您可以设置样式,其中标题绑定到基础对象的属性。在这种情况下,它可能有效,但您的BodyOfDataGrid必须包含Header属性

答案 1 :(得分:0)

我发现要做的是创建DataTable并将其绑定到DataGrid

<强> XAML:

<DataGrid Name="dataGrid" />

代码背后:

    public MainWindow()
    {
        InitializeComponent();
        PopulateDataGrid();
    }

    DataTable employeeDataTable = new DataTable();

    private void PopulateDataGrid()
    {
        var _ds = new DataSet("Test");

        employeeDataTable = _ds.Tables.Add("DT");
        for (int i = 0; i < 10; i++)//create columns
        {   
            if(i==0)
                employeeDataTable.Columns.Add("Row");                
            employeeDataTable.Columns.Add(i.ToString());
        }
        for (int i = 0; i < 10; i++)//fill data to rows
        {
            var theRow = employeeDataTable.NewRow();
            for (int j = 0; j < 10; j++)
            {
                if (j == 0)
                {
                    theRow[j] = (i + 1);
                    continue;
                }
                if (j % 2 == 0)                    
                    theRow[j] = "a";  
                else                  
                    theRow[j] = "b";
            }
            employeeDataTable.Rows.Add(theRow);
        }
        dataGrid.ItemsSource = employeeDataTable.AsDataView();
    }