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

如何用C#代码为WPF DataGrid创建DataTrigger

WPF DataGrid 代码实现DataTrigger行前景色效果

一、完整C#实现代码

先定义基础的User类(如果不需要动态更新属性,基础版本即可):

public class User
{
    public int Number { get; set; }
    public string Name { get; set; }
    // 其他业务属性
}

在窗口的Loaded事件或构造函数中编写样式与触发器逻辑:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // 构建DataGrid行样式
    Style rowStyle = new Style(typeof(DataGridRow));

    // 创建DataTrigger:匹配Number属性为10的行
    DataTrigger numberMatchTrigger = new DataTrigger
    {
        Binding = new Binding("Number"),
        Value = 10
    };
    // 添加前景色设置器
    numberMatchTrigger.Setters.Add(new Setter(ForegroundProperty, Brushes.Red));

    // 将触发器加入样式
    rowStyle.Triggers.Add(numberMatchTrigger);

    // 绑定样式到DataGrid
    dataGridDemo.RowStyle = rowStyle;

    // 示例数据源绑定
    var userList = new List<User>
    {
        new User { Name = "Alice", Number = 7 },
        new User { Name = "Bob", Number = 10 },
        new User { Name = "Charlie", Number = 12 }
    };
    dataGridDemo.ItemsSource = userList;
}

二、关于INotifyPropertyChanged的必要性

  • 初始化场景:如果只是在加载数据源时让触发器生效,不需要实现INotifyPropertyChanged,只要User的Number属性有正确值即可。
  • 动态更新场景:如果需要在运行时修改User的Number属性后,行的前景色自动同步变化,必须实现INotifyPropertyChanged接口——WPF依赖属性变更通知来重新评估DataTrigger的绑定条件。

实现了INotifyPropertyChanged的User类示例:

public class User : INotifyPropertyChanged
{
    private int _number;
    public int Number
    {
        get => _number;
        set
        {
            if (_number != value)
            {
                _number = value;
                OnPropertyChanged(nameof(Number));
            }
        }
    }

    public string Name { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

三、常见失效原因排查

  • 绑定路径错误:确认Binding("Number")中的属性名与User类的属性完全一致(大小写敏感)。
  • 值类型不匹配:如果Number是int类型,Trigger的Value必须是10(int),不能是字符串"10",否则无法匹配。
  • 样式被覆盖:检查XAML或其他代码是否设置了DataGrid.RowStyle,确保最终应用的是你通过C#创建的样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:01:35