动态创建的DataTrigger无法生效问题求助
动态DataTrigger不生效的解决方法
1. 修正布尔值大小写
C#里布尔常量是小写的true,你代码里写的True属于语法错误,会导致类型不匹配,触发器无法触发。把所有Trigger_X.Value = True;、row["Spec_X" + ...] = True;这类代码里的True改成true。
2. 确保DataTable列类型正确
如果DataTable里的"Spec_X*"、"Spec_Y*"列不是布尔类型,绑定的时候会因为类型不匹配导致触发器不生效。在创建DataTable列时,要明确指定类型:
// 先统一解析Test_Num的值 int testNum = int.Parse(Test_Num["Test_Num"].ToString()); // 为动态列指定明确类型 Table_Performance_Data.Columns.Add($"X{testNum}", typeof(double?)); Table_Performance_Data.Columns.Add($"Y{testNum}", typeof(double?)); Table_Performance_Data.Columns.Add($"Spec_X{testNum}", typeof(bool)); Table_Performance_Data.Columns.Add($"Spec_Y{testNum}", typeof(bool));
如果是需要生成多组动态列,要循环为每个Test_Num创建对应列,且保证类型一致。
3. 检查字段名一致性
创建列时的字段名(比如"Spec_X" + testNum)和填充行时的字段名("Spec_X" + dt["Test_Num"].ToString())必须完全匹配:
- 先把Test_Num的值存为变量,避免重复解析时出现格式或数值差异:
int columnTestNum = int.Parse(Test_Num["Test_Num"].ToString()); // 创建触发器绑定路径时用这个变量 Trigger_X.Binding = new Binding($"Spec_X{columnTestNum}");
- 如果是多列场景,要循环创建对应每个Test_Num的列,不能只创建一次X/Y列就适配所有行的动态字段。
4. 验证Binding路径正确性
可以通过调试查看DataTable的列名集合,确认触发器的Binding路径是否和行数据中的字段名完全一致。比如填充行后打印row.Table.Columns的名称列表,和触发器里的Binding路径做对比。
修正后的关键代码片段
// 统一解析Test_Num int testNum = int.Parse(Test_Num["Test_Num"].ToString()); // 创建X列触发器 Style columnStyle_X = new Style(typeof(TextBlock)); DataTrigger Trigger_X = new DataTrigger(); Trigger_X.Binding = new Binding($"Spec_X{testNum}"); Trigger_X.Value = true; // 修正为小写布尔值 Trigger_X.Setters.Add(new Setter(TextBlock.ForegroundProperty, new SolidColorBrush(Colors.Firebrick))); columnStyle_X.Triggers.Add(Trigger_X); Column_X.ElementStyle = columnStyle_X; // 填充行数据时 row[$"Spec_X{testNum}"] = true; // 修正为小写布尔值
内容的提问来源于stack exchange,提问作者dadou
相关产品推荐
相关产品推荐

