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

动态创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:48:14