You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为WPF DataGrid指定行号的行设置背景色?

按行号设置WPF DataGrid行背景色的实现方案

不需要额外添加索引列,有两种更直接的方式可以实现你的需求,以下是针对两个场景的具体实现:

方案一:通过LoadingRow事件(后台代码实现)

这种方式逻辑简单直接,适合快速完成特定行的样式配置。

场景1:仅将第三行背景设为绿色

注意:WPF DataGrid的行索引是从0开始计数的,所以第三行对应的索引是2。

  1. 在XAML的DataGrid标签中添加LoadingRow事件绑定:
<DataGrid x:Name="grdRes" ItemsSource="{Binding Path=DvAirports, Mode=OneWay}" 
          HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" 
          CanUserAddRows="False" CanUserDeleteRows="False"
          Style="{DynamicResource Esri_DataGrid}" Margin="0,0,0,31"
          LoadingRow="grdRes_LoadingRow">
<!-- 列定义保持不变 -->
</DataGrid>
  1. 在后台代码中实现事件处理逻辑:
private void grdRes_LoadingRow(object sender, DataGridRowEventArgs e)
{
    if (e.Row.GetIndex() == 2)
    {
        e.Row.Background = new SolidColorBrush(Colors.Green);
    }
}

场景2:将第1至第5行背景设为橙色

第1到第5行对应的索引范围是0-4,修改事件逻辑即可:

private void grdRes_LoadingRow(object sender, DataGridRowEventArgs e)
{
    int rowIndex = e.Row.GetIndex();
    if (rowIndex >= 0 && rowIndex <= 4)
    {
        e.Row.Background = new SolidColorBrush(Colors.Orange);
    }
}

方案二:纯XAML样式触发器实现

如果希望完全通过XAML配置,不编写后台代码,可以利用DataGridRow的AlternationIndex属性结合触发器实现。

场景1:第三行设为绿色

需要先给DataGrid设置一个足够大的AlternationCount(确保大于你的最大行号),然后通过触发器匹配索引:

<DataGrid x:Name="grdRes" ItemsSource="{Binding Path=DvAirports, Mode=OneWay}" 
          HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" 
          CanUserAddRows="False" CanUserDeleteRows="False"
          Style="{DynamicResource Esri_DataGrid}" Margin="0,0,0,31"
          AlternationCount="100">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <Trigger Property="AlternationIndex" Value="2">
                    <Setter Property="Background" Value="Green"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <!-- 列定义保持不变 -->
</DataGrid>

场景2:第1至第5行设为橙色

这种情况可以结合值转换器来判断索引范围:

  1. 首先创建一个值转换器类:
public class RowIndexRangeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is int index && index >= 0 && index <= 4)
        {
            return new SolidColorBrush(Colors.Orange);
        }
        return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  1. 在XAML中引用转换器并配置行样式:
<Window.Resources>
    <local:RowIndexRangeConverter x:Key="RowIndexConverter"/>
</Window.Resources>

<DataGrid x:Name="grdRes" ItemsSource="{Binding Path=DvAirports, Mode=OneWay}" 
          HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" 
          CanUserAddRows="False" CanUserDeleteRows="False"
          Style="{DynamicResource Esri_DataGrid}" Margin="0,0,0,31"
          AlternationCount="100">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" 
                    Value="{Binding RelativeSource={RelativeSource Self}, Path=AlternationIndex, Converter={StaticResource RowIndexConverter}}"/>
        </Style>
    </DataGrid.RowStyle>
    <!-- 列定义保持不变 -->
</DataGrid>

关键注意点

  • 行索引从0开始,配置时要注意对应关系;
  • 如果DataGrid存在数据动态更新或分页,LoadingRow事件会在每行重新加载时自动触发,样式会同步更新;
  • 纯XAML方式的AlternationCount需设置为大于预期的最大行号,避免索引循环复用。

内容的提问来源于stack exchange,提问作者sinDizzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:06:26