Search code examples
c#wpfdatagrid

How to Add Values to Columns which is define at runtime (WPF Datagrid)


My XAML (Contains two Static Columns)

<DataGrid x:Name="grid" Grid.Row="1" AutoGenerateColumns="False" ItemsSource=" 
{Binding }">
        <DataGrid.Columns>          
            <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
        </DataGrid.Columns>
    </DataGrid>

Code Behind for Datagrid Collection.

 ObservableCollection<Users> list = new ObservableCollection<Users>();
    class Users
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

Adding columns at runtime from Code Behind

private void AddColumnsAtRuntime()
    {
        grid.Columns.Add(new DataGridTextColumn()
        {
            Header = "Address",
            Binding = new Binding("Address") 
        });
    }

enter image description here

Populating Collection

 private void AddRow()
    {
        list.Add(new Users()
        {
            Id = 1,
            Name = "John"
        });
    }

enter image description here

What i want is - How can i add Values to both static and dynamic columns, static columns will contain some Style trigger


Solution

  • Instead of binding to an ObservableCollection<Users>, you could bind to the DataView of a DataTable to which you can add columns dynamically:

    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(new DataColumn("Id"));
    dataTable.Columns.Add(new DataColumn("Name"));
    list = dataTable.DefaultView;
    ...
    list.Table.Rows.Add(1, "John");
    ...
    list.Table.Columns.Add(new DataColumn("Address"));
    list.Table.Rows[dataTable.Rows.Count - 1]["Address"] = "address...";
    

    The XAML is exactly the same as before:

    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
    </DataGrid.Columns>