Search code examples
wpfwpfdatagrid

DataGrid's selected row color when inactive


How can I style WPF DataGrid to change the color of selected row when DataGrid lost its focus?


Solution

  • Find an answer by myself.

    Add to DataGrid's resources the brush, which can change its 'Color' property from code behind, and reference HighlightBrushKey to it:

    <DataGrid.Resources>
        <SolidColorBrush x:Key="SelectionColorKey" Color="DarkGray"/>
        <Style TargetType="DataGridRow">
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Source={StaticResource SelectionColorKey}, Path=Color}"/>
            </Style.Resources>
        </Style>
    </DataGrid.Resources>
    

    Then add DataGrids event handlers to manually change the color:

    private void DataGrid1_LostFocus(object sender, RoutedEventArgs e)
    {
        ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = Colors.DarkGray;
    }
    
    private void DataGrid1_GotFocus(object sender, RoutedEventArgs e)
    {
        ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = SystemColors.HighlightColor;
    }
    
    private void DataGrid1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = Colors.DarkGray;
    }