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

如何在WPF DataGrid中仅为数据行添加带圆角的纯色背景

WPF DataGrid 数据行圆角背景实现方案

核心思路

WPF没有直接提供行顺序属性,但可以通过ItemsControl.AlternationIndex结合DataGrid.Items.Count,用转换器判断当前行是首行、末行还是中间行,动态设置不同的圆角和背景样式。

步骤1:实现行位置判断转换器

创建一个多值转换器,根据行索引和总行数返回对应的圆角值:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

public class RowPositionToCornerRadiusConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length != 2 || !(values[0] is int index) || !(values[1] is int count))
            return new CornerRadius(0);
        
        if (count == 0) return new CornerRadius(0);
        if (index == 0)
            return new CornerRadius(8, 8, 0, 0); // 首行圆角
        if (index == count - 1)
            return new CornerRadius(0, 0, 8, 8); // 末行圆角
        return new CornerRadius(0); // 中间行无圆角
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

步骤2:XAML中配置样式与绑定

在窗口/用户控件的资源中声明转换器,同时定义DataGridRow和DataGridColumnHeader的样式:

<Window.Resources>
    <!-- 引用转换器 -->
    <local:RowPositionToCornerRadiusConverter x:Key="RowPositionConverter"/>
    
    <!-- 数据行样式:带圆角背景 -->
    <Style TargetType="DataGridRow">
        <Setter Property="Background" Value="#F5F5F5"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridRow">
                    <Border 
                        Background="{TemplateBinding Background}"
                        CornerRadius="{Binding 
                            RelativeSource={RelativeSource TemplatedParent},
                            Path=(ItemsControl.AlternationIndex),
                            Converter={StaticResource RowPositionConverter},
                            ConverterParameter={Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=Items.Count}}">
                        <SelectiveScrollingGrid>
                            <SelectiveScrollingGrid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </SelectiveScrollingGrid.ColumnDefinitions>
                            <SelectiveScrollingGrid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                            </SelectiveScrollingGrid.RowDefinitions>
                            <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" Visibility="{TemplateBinding DetailsVisibility}" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                            <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!-- 表头样式:无背景 -->
    <Style TargetType="DataGridColumnHeader">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="0"/>
    </Style>
</Window.Resources>

步骤3:启用DataGrid的AlternationIndex

在DataGrid标签中设置AlternationCount为足够大的值,确保每个行都能获得唯一的索引:

<DataGrid 
    AlternationCount="{x:Static sys:Int32.MaxValue}"
    <!-- 其他属性 -->
    />

需要引入System命名空间:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

注意事项

  • 背景色和圆角大小可根据需求修改转换器中的CornerRadius数值以及样式中的Background值
  • 如果数据有动态增删,转换器会自动更新圆角样式,因为绑定了Items.Count

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:13:36