Reputation: 612
I have looked on SO but haven't found an exact answer to what I am looking for. I have a DataGrid view bound to a data source. I want to style columns programmatically after the window with the datagrid is visible. I also want to change it from time to time based on some behavior.
I tried to use the DataGridTemplateColumn but whenever it runs it deletes the data from those columns. Also I don't get the Cell Style when I try to get it from Resources (i.e. its always null)
private void StyleColumns()
{
// Replace the DueDate column with a custom template column.
for (int i = 0; i < 7; i += 2)
{
// Create a new template column.
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
templateColumn.Header = m_DataGrid.Columns[i].Header;
Style style = new Style();
templateColumn.CellStyle = (Style)Resources["ColumnGone"];
// ...
// Replace the auto-generated column with the templateColumn.
m_DataGrid.Columns[i] = templateColumn;
}
}
XAML is like this
<DataGrid AutoGenerateColumns="True" x:Name="m_grfFileDataGrid" ItemsSource="{Binding cb.GRF}"
RowHeight="20" ColumnWidth="*"
AlternatingRowBackground="Beige"
SelectionUnit="CellOrRowHeader"
FontFamily="Consolas"
FontSize="12"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False">
<DataGrid.Resources>
<Style TargetType="DataGridCell" x:Key="ColumnGone">
<Setter Property="Background" Value="SeaGreen"/>
</Style>
<Style x:Key="DisabledColumn">
<Setter Property="DataGridColumn.CanUserResize"
Value="False" />
<Setter Property="DataGridColumn.CanUserSort"
Value="False" />
<Setter Property="DataGridColumn.CanUserReorder"
Value="False" />
<Setter Property="DataGridColumn.CellStyle"
Value="{StaticResource ColumnGone}" />
</Style>
</DataGrid.Resources>
</DataGrid>
Any help on this would be appreciated. thanks
Upvotes: 3
Views: 12333
Reputation: 1
/*****************************************************************
* Color me pink, but I found the following a straightforward method
* to change the style of the columns in a WPF DataGrid.
* My code populated a DataTable with Crypto Exchange market Ticker
* information. Four of the five columns had numeric data, which I
* wanted to right align.
*****************************************************************/
DataTable dtblTickers;
...
// Code populated five columns in dtblTickers
...
// bind the five (5) column DataTable to a WPF DataGrid already in the Form
gridTickers.DataContext = dtblTickers;
// Auto generate the DataGrid columns to fit the data
gridTickers.AutoGenerateColumns = true;
// Unfortunately, the four numeric columns are left aligned.
// Now, change the alignment of the numeric columns to be right aligned.
// This requires creation of a Setter object for Cell Style, as follows:
// Create a Style object for reuse.
Style cellStyle = new Style(typeof(DataGridCell));
// Create a Setter object to set (get it? Setter) horizontal alignment.
Setter setAlign = new
Setter(DataGridCell.HorizontalAlignmentProperty,
HorizontalAlignment.Right);
// Bind the Setter object above to the Style object
cellStyle.Setters.Add(setAlign);
// Bind the new Right Alignment Style object to each of the numeric columns.
gridTickers.Columns[1].CellStyle = cellStyle;
gridTickers.Columns[2].CellStyle = cellStyle;
gridTickers.Columns[3].CellStyle = cellStyle;
gridTickers.Columns[4].CellStyle = cellStyle;
// Refresh the WPF DataGrid to show the new alignment settings.
gridTickers.Items.Refresh();
// Done. The WPF DataGrid now has the four numeric columns right aligned.
Upvotes: 0
Reputation: 22702
Here's an example of adding a column with Style
:
XAML
<Grid>
<DataGrid x:Name="m_DataGrid" Width="400"
AutoGenerateColumns="True"
HorizontalAlignment="Left"
RowHeight="20" ColumnWidth="*"
AlternatingRowBackground="Beige"
SelectionUnit="CellOrRowHeader"
FontFamily="Consolas"
FontSize="12"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False">
<DataGrid.Resources>
<Style TargetType="DataGridCell" x:Key="ColumnGone">
<Setter Property="Background" Value="SeaGreen" />
<Setter Property="Foreground" Value="White" />
</Style>
<Style x:Key="DisabledColumn">
<Setter Property="DataGridColumn.CanUserResize"
Value="False" />
<Setter Property="DataGridColumn.CanUserSort"
Value="False" />
<Setter Property="DataGridColumn.CanUserReorder"
Value="False" />
<Setter Property="DataGridColumn.CellStyle"
Value="{StaticResource ColumnGone}" />
</Style>
</DataGrid.Resources>
</DataGrid>
<Button Name="AddColumn" Content="AddColumn" Width="100" Height="30" HorizontalAlignment="Right" Click="AddColumn_Click" />
</Grid>
Code behind
public class Person
{
public string Sample { get; set; }
}
private ObservableCollection<Person> TestCollection = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
TestCollection.Add(new Person() { Sample = "Orange"});
TestCollection.Add(new Person() { Sample = "White"});
TestCollection.Add(new Person() { Sample = "Green"});
m_DataGrid.ItemsSource = TestCollection;
}
private void StyleColumns()
{
DataGridTextColumn MyColumn = new DataGridTextColumn();
MyColumn.Header = "Test";
MyColumn.Binding = new Binding("Sample");
Style style = (Style)m_DataGrid.Resources["ColumnGone"];
MyColumn.CellStyle = style;
m_DataGrid.Columns.Add(MyColumn);
}
private void AddColumn_Click(object sender, RoutedEventArgs e)
{
StyleColumns();
}
Most likely, you do not pointed Binding
for the new column.
Alternatively, set the Style
for an existing column:
Specify the name of the column:
<DataGridTextColumn x:Name="MySuperColumn" Header="MyColumn" Binding="{Binding Path=Sample}" Width="100" />
Set the Style
in code:
MySuperColumn.CellStyle = style;
Upvotes: 2