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

本文关键字:DataGridTextColumn 绑定 DataGrid 创建 何动态 动态 | 更新日期: 2023-09-27 18:24:13

我有两个属性:

  • 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,并且我需要在DataGridDataGridTextColumns中显示集合HeaderOfDataGrid的所有700项。因此,我需要基于HeaderOfDataGrid属性(集合)创建700个DataGridTextColumns。此外,如果HeaderOfDataGrid属性的Count是700,则BodyOfDataGrid属性也具有相同的Count(例如,700)。所以使用硬编码的xaml对我来说并不方便

我知道我可以这样绑定:

<DataGrid ItemsSource="{Binding Path=Body, Mode=TwoWay}"/>

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

如何在没有硬编码xamlDataGridTextColumn的情况下实现绑定和创建?

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

你不能两全其美。如果你想重命名标题,你必须手动编码;否则,你会自动完成并使用它给你的东西。

您可以设置一个样式,其中标头绑定到基础对象的属性。在这种情况下,它可能会起作用,但BodyOfDataGrid必须包含Header属性

我发现要做的是创建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();
    }