Hi, refer the below function, it adds DataGridTextColumn dyn
private void SetColumnsAndBinding(DataTable objTable)
{
DataGridTemplateColumn objRadioButtonColumn = new DataGridTemplateColumn();
DataTemplate RadioButtonCellTemplate = new DataTemplate();
FrameworkElementFactory objRadButtonColumnFactory = new FrameworkElementFactory(typeof(RadioButton));
objRadioButtonColumn.SetValue(RadioButton.GroupNameProperty, "Trial");
RadioButtonCellTemplate.VisualTree = objRadButtonColumnFactory;
objRadioButtonColumn.CellTemplate = RadioButtonCellTemplate;
YourDataGrid.Columns.Add(objRadioButtonColumn);
foreach (DataColumn objColumn in objTable.Columns)
{
DataGridTextColumn objDgridColumn = new DataGridTextColumn();
objDgridColumn.Header = objColumn.ColumnName;
Binding objBinding = new Binding();
objBinding.Path = new PropertyPath(objColumn.ColumnName);
objDgridColumn.Binding = objBinding;
YourDataGrid.Columns.Add(objDgridColumn);
}
}
This function adds a
DataGridTemplateColumn in datagrid to show radiobutton. And it adds
DataGridTextColumn objects based on the columns present in the DataTable, which is read from XML file. This is working. But it violates MVVM principle. In order to use this technique in MVVM, I did the following,
1. Declaring an
ObservableCollection of
DataGridColumn in the ViewModel to hold the columns collection, like this,
private ObservableCollection<DataGridColumn> _CustomColumns = new ObservableCollection<DataGridColumn>();
public ObservableCollection<DataGridColumn> CustomColumns
{
get { return _CustomColumns; }
set
{
_CustomColumns = value;
OnPropertyChanged("CustomColumns");
}
}
By just modifying the above function, I can add columns to above collection like this,
private void SetColumnsAndBinding(DataTable objTable)
{
DataGridTemplateColumn objRadioButtonColumn = new DataGridTemplateColumn();
DataTemplate RadioButtonCellTemplate = new DataTemplate();
FrameworkElementFactory objRadButtonColumnFactory = new FrameworkElementFactory(typeof(RadioButton));
objRadioButtonColumn.SetValue(RadioButton.GroupNameProperty, "Trial");
RadioButtonCellTemplate.VisualTree = objRadButtonColumnFactory;
objRadioButtonColumn.CellTemplate = RadioButtonCellTemplate;
YourViewModel.CustomColumns.Add(objRadioButtonColumn);
foreach (DataColumn objColumn in objTable.Columns)
{
DataGridTextColumn objDgridColumn = new DataGridTextColumn();
objDgridColumn.Header = objColumn.ColumnName;
Binding objBinding = new Binding();
objBinding.Path = new PropertyPath(objColumn.ColumnName);
objDgridColumn.Binding = objBinding;
YourViewModel.CustomColumns.Add(objDgridColumn);
}
}
Now, we have to bind this
ObservableCollection of
DataGridColumns to the datagrid. In this point, I cannot bind this collection to DataGrid's Columns property. For that I have referred the solution from StackOverflow link below,
c# - How do I bind a WPF DataGrid to a variable number of columns? - Stack Overflow[
^]
According to this StackOverflow solution, I just added
DataGridColumnsBehavior class in my solution. And changed DataGrid xaml like below,
<DataGrid x:Name="MyDataGrid" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding myTable}" AutoGenerateColumns="False" local:DataGridColumnsBehavior.BindableColumns="{Binding CustomColumns}" />
Use this.