如何在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
相关产品推荐
相关产品推荐

