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

WPF DataGrid基于首列值设置动态列样式的实现问询

可行,实现方案如下

核心思路

通过多值绑定+转换器实现:同时绑定当前单元格的数值与行首的Metric字段,根据Metric是否包含"growth"来控制数值格式和文字颜色。


步骤1:定义转换器

创建两个多值转换器,分别处理数值格式化和文字颜色逻辑:

数值转百分比格式转换器

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

namespace YourNamespace
{
    public class ValueToPercentageConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            // 校验输入参数有效性
            if (values.Length != 2 || !(values[0] is double value) || !(values[1] is string metric))
                return value.ToString("N2");

            // 含"growth"则按百分比显示,否则保留两位小数
            return metric.IndexOf("growth", StringComparison.OrdinalIgnoreCase) >= 0 
                ? $"{value:P2}" 
                : value.ToString("N2");
        }

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

数值转文字颜色转换器

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

namespace YourNamespace
{
    public class ValueToColorConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2 || !(values[0] is double value) || !(values[1] is string metric))
                return Brushes.Black;

            // 仅对含"growth"的指标应用颜色规则
            if (metric.IndexOf("growth", StringComparison.OrdinalIgnoreCase) < 0)
                return Brushes.Black;

            return value > 0 ? Brushes.Green : value < 0 ? Brushes.Red : Brushes.Black;
        }

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

步骤2:修改动态列创建逻辑

在原有C#代码中,将普通绑定替换为多值绑定,同时为单元格设置样式绑定颜色:

var viewModel = (SnapshotViewModel)DataContext;
// 从资源中获取转换器(需先在XAML中声明资源)
var percentageConverter = (ValueToPercentageConverter)FindResource("ValueToPercentageConverter");
var colorConverter = (ValueToColorConverter)FindResource("ValueToColorConverter");

foreach (var date in OverviewCompViewModel.DateColumns)
{
    var column = new DataGridTextColumn
    {
        Header = date,
        // 多值绑定:同时绑定当前日期的数值和行的Metric字段
        Binding = new MultiBinding
        {
            Bindings =
            {
                new Binding($"DateValues[{date}]"),
                new Binding("Metric") // 绑定当前行的Metric属性
            },
            Converter = percentageConverter
        },
        // 设置单元格前景色的多值绑定
        CellStyle = new Style(typeof(DataGridCell))
        {
            Setters =
            {
                new Setter(
                    DataGridCell.ForegroundProperty,
                    new MultiBinding
                    {
                        Bindings =
                        {
                            new Binding($"DateValues[{date}]"),
                            new Binding("Metric")
                        },
                        Converter = colorConverter
                    })
            }
        }
    };
    HistoricDataGrid.Columns.Add(column);
}

步骤3:在XAML中声明转换器资源

在Window/UserControl的资源节点中添加转换器声明(替换YourNamespace为实际命名空间):

<Window.Resources>
    <local:ValueToPercentageConverter x:Key="ValueToPercentageConverter"/>
    <local:ValueToColorConverter x:Key="ValueToColorConverter"/>
</Window.Resources>

<!-- 原有DataGrid代码保持不变 -->
<DataGrid Grid.Row="1" x:Name="HistoricDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding FinancialMetrics}" CanUserAddRows="False" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Metric" Binding="{Binding Metric}" />
    </DataGrid.Columns>
</DataGrid>

注意事项

  1. 假设DateValues中存储的是double类型数值,若为decimal需修改转换器中的类型判断;
  2. 字符串匹配使用OrdinalIgnoreCase忽略大小写,如需精确匹配可移除该参数;
  3. 若需复用单元格样式,可将CellStyle定义到XAML资源中,避免重复创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:13:17