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

WinUI 3中如何基于绑定值修改DataGrid单元格背景色

在WinUI 3中修改DataGrid单元格背景色的方法

一、静态修改单元格背景色

如果只是要统一设置某列或所有单元格的背景色,直接通过CellStyle或列的ElementStyle就能实现:

  • 全局设置所有单元格:
<controls:DataGrid>
    <controls:DataGrid.CellStyle>
        <Style TargetType="controls:DataGridCell">
            <Setter Property="Background" Value="#FFE0F7FA"/>
        </Style>
    </controls:DataGrid.CellStyle>
</controls:DataGrid>
  • 针对特定列设置:
<controls:DataGridTextColumn Header="名称" Binding="{Binding Name}">
    <controls:DataGridTextColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="#FFFCE4EC"/>
        </Style>
    </controls:DataGridTextColumn.ElementStyle>
</controls:DataGridTextColumn>

二、基于绑定值动态修改背景色

方法1:使用值转换器(IValueConverter)

先写一个实现IValueConverter的类,根据绑定的值返回对应颜色:

using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Media;

public class StatusToBackgroundColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is string status)
        {
            return status switch
            {
                "已完成" => new SolidColorBrush(Microsoft.UI.Colors.Green),
                "进行中" => new SolidColorBrush(Microsoft.UI.Colors.Yellow),
                "未开始" => new SolidColorBrush(Microsoft.UI.Colors.Red),
                _ => new SolidColorBrush(Microsoft.UI.Colors.Transparent)
            };
        }
        return new SolidColorBrush(Microsoft.UI.Colors.Transparent);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

接着在XAML页面资源里声明这个转换器:

<Page.Resources>
    <local:StatusToBackgroundColorConverter x:Key="StatusToColorConverter"/>
</Page.Resources>

最后在DataGrid列中绑定使用:

<controls:DataGridTextColumn Header="状态" Binding="{Binding Status}">
    <controls:DataGridTextColumn.CellStyle>
        <Style TargetType="controls:DataGridCell">
            <Setter Property="Background" Value="{Binding Status, Converter={StaticResource StatusToColorConverter}}"/>
        </Style>
    </controls:DataGridTextColumn.CellStyle>
</controls:DataGridTextColumn>

方法2:使用DataTemplate与VisualState触发器

如果需要更复杂的视觉状态切换,用DataTemplate结合VisualStateManager实现:

<controls:DataGridTemplateColumn Header="进度">
    <controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Grid x:Name="CellGrid" Background="Transparent">
                <TextBlock Text="{Binding Progress}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup>
                        <VisualState x:Name="LowProgress">
                            <VisualState.Setters>
                                <Setter Target="CellGrid.Background" Value="#FFEF9A9A"/>
                            </VisualState.Setters>
                            <VisualState.StateTriggers>
                                <CompareStateTrigger Value="{Binding Progress}" Comparison="LessThan" ValueToCompare="30"/>
                            </VisualState.StateTriggers>
                        </VisualState>
                        <VisualState x:Name="MediumProgress">
                            <VisualState.Setters>
                                <Setter Target="CellGrid.Background" Value="#FFFCD299"/>
                            </VisualState.Setters>
                            <VisualState.StateTriggers>
                                <CompareStateTrigger Value="{Binding Progress}" Comparison="GreaterThanOrEqual" ValueToCompare="30"/>
                                <CompareStateTrigger Value="{Binding Progress}" Comparison="LessThan" ValueToCompare="70"/>
                            </VisualState.StateTriggers>
                        </VisualState>
                        <VisualState x:Name="HighProgress">
                            <VisualState.Setters>
                                <Setter Target="CellGrid.Background" Value="#FFA5D6A7"/>
                            </VisualState.Setters>
                            <VisualState.StateTriggers>
                                <CompareStateTrigger Value="{Binding Progress}" Comparison="GreaterThanOrEqual" ValueToCompare="70"/>
                            </VisualState.StateTriggers>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Grid>
        </DataTemplate>
    </controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:23:18