This
wpf datagrid conditional row color - Google Search[
^] found:
wpf - How to set DataGrid's row Background, based on a property value using data bindings - Stack Overflow[
^]
UPDATE: As you are not using data binding, here is a code-behind version.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Mock();
}
public ObservableCollection<Person> Persons { get; }
= new ObservableCollection<Person>();
private void Mock()
{
var rnd = new Random();
for (int i = 0; i < 100; i++)
{
Persons.Add(new Person
{
Name = $"Person {i}",
Age = rnd.Next(20, 50)
});
}
DataGrid1.LoadingRow += DataGrid1_LoadingRow;
DataGrid1.ItemsSource = Persons;
}
private void DataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
{
var row = e.Row;
var person = row.DataContext as Person;
if (person.Age > 30 && person.Age < 40)
{
row.Background = new SolidColorBrush(Colors.Red);
}
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
UPDATE #2: Here is a Hierarchical DataGrid version... Works the same, just wired up a little different...
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Mock();
}
public ObservableCollection<Parent> Parents { get; }
= new ObservableCollection<Parent>();
private void Mock()
{
var rnd = new Random();
for (int i = 0; i < 100; i++)
{
var parent = new Parent { Name = $"Parent {i}", Age = rnd.Next(20, 50) };
for (int j = 0; j < 20; j++)
{
parent.Children.Add(new Person
{
Name = $"Child {i}",
Age = rnd.Next(1, 10)
});
}
Parents.Add(parent);
}
DataGrid1.LoadingRow += DataGrid1_LoadingRow;
DataGrid1.ItemsSource = Parents;
}
private void DataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
{
var row = e.Row;
var person = row.DataContext as Person;
if (sender == DataGrid1)
{
if (person.Age > 30 && person.Age < 40)
{
row.Background = new SolidColorBrush(Colors.Red);
}
}
else if (person.Age > 4 && person.Age < 6)
{
row.Background = new SolidColorBrush(Colors.Green);
}
}
}
public class Parent : Person
{
public ObservableCollection<Person> Children { get; }
= new ObservableCollection<Person>();
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
And the XAML...
<Window
x:Class="DataGridCodeBehindRowColorTrigger.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="CodeProject - DataGrid Custom Row Color"
WindowStartupLocation="CenterScreen" Height="300" Width="600">
<Grid>
<DataGrid x:Name="DataGrid1"
GridLinesVisibility="None"
AlternatingRowBackground="GhostWhite" AlternationCount="1"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
AutoGenerateColumns="False" IsReadOnly="True"
RowDetailsVisibilityMode="VisibleWhenSelected"
VirtualizingPanel.ScrollUnit="Pixel">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="*" />
<DataGridTextColumn Header="Age"
Binding="{Binding Age}"
Width="70"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Children}"
LoadingRow="DataGrid1_LoadingRow"
GridLinesVisibility="None"
AlternatingRowBackground="GhostWhite"
AlternationCount="1"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="*" />
<DataGridTextColumn Header="Age"
Binding="{Binding Age}"
Width="70"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>