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

