根据其值在 DataGrid 中设置单元格样式

Styling Cell in DataGrid according to its value

我有一个 DataGrid 值。我想检查每个单元格,如果值不在两个数字(限制)之间,我想将背景更改为红色。 DataGrid 的每一列的限制都不同。我试图通过更改 DataGridOnAutoGeneratingColumn 方法中的 ColumnStyle 来实现它,但到目前为止我没有成功。你能看看我的代码有什么问题吗?

OnAutoGeneratingColumn方法:

protected override void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e)
        {

            //The first yolumn with date I dont want to alter
            if (Columns.Count == 0)
            {
                base.OnAutoGeneratedColumns(e);
            }
            else {
                //Trigger to chech if the number is lower than the bottom limit
                DataTrigger lowerTrigger = new DataTrigger();
                lowerTrigger.Binding = new Binding("Content")
                {
                    Converter = new LessThanConverter(),
                    ConverterParameter = SelectedDevices[this.Columns.Count - 1].minValue
                };
                lowerTrigger.Value = "True";
                lowerTrigger.Setters.Add(new Setter(DataGridCell.BackgroundProperty, Brushes.Red));


                //Trigger to check if the number is higher than the top limit
                DataTrigger higherTrigger = new DataTrigger();
                higherTrigger.Binding = new Binding("Content")
                {
                    Converter = new LessThanConverter(),
                    ConverterParameter = SelectedDevices[this.Columns.Count - 1].maxValue
                };
                higherTrigger.Value = "False";
                higherTrigger.Setters.Add(new Setter(DataGridCell.BackgroundProperty, Brushes.Red));


                //Multi triger to check, whether the number is between the tow limits
                MultiDataTrigger betweenTrigger = new MultiDataTrigger();
                Condition conditionMin = new Condition();
                conditionMin.Binding = new Binding("Content")
                {
                    Converter = new LessThanConverter(),
                    ConverterParameter = SelectedDevices[this.Columns.Count-1].minValue
                };
                conditionMin.Value = "False";

                Condition conditionMax = new Condition();
                conditionMax.Binding = new Binding("Content")
                {
                    Converter = new LessThanConverter(),
                    ConverterParameter = SelectedDevices[this.Columns.Count - 1].maxValue
                };
                conditionMax.Value = "True";

                betweenTrigger.Conditions.Add(conditionMax);
                betweenTrigger.Conditions.Add(conditionMin);

                betweenTrigger.Setters.Add(new Setter(DataGridCell.BackgroundProperty, Brushes.Blue));

                Style style = new Style(typeof(DataGridCell));
                style.Triggers.Add(lowerTrigger);
                //style.Triggers.Add(betweenTrigger);
                style.Triggers.Add(higherTrigger);

                e.Column.CellStyle = style;

                base.OnAutoGeneratedColumns(e);
            }
        }

LessThanConverter class:

public class LessThanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
        {

            double dValue = System.Convert.ToDouble(value);
            double dParameter = System.Convert.ToDouble(parameter);

            return (dValue <= dParameter);
        }

        public object ConvertBack(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            return null;
        }
    }

所以我终于找到了解决方案。我的错误是,不可能像我那样绑定转换器的值 new Binding("Content")。正确的解决方案是将它绑定到列的名称,这可以在运行时使用 e.Column.Header.ToString() 完成,而不是它正在工作!