根据其值在 DataGrid 中设置单元格样式
Styling Cell in DataGrid according to its value
我有一个 DataGrid
值。我想检查每个单元格,如果值不在两个数字(限制)之间,我想将背景更改为红色。 DataGrid
的每一列的限制都不同。我试图通过更改 DataGrid
的 OnAutoGeneratingColumn
方法中的 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()
完成,而不是它正在工作!
我有一个 DataGrid
值。我想检查每个单元格,如果值不在两个数字(限制)之间,我想将背景更改为红色。 DataGrid
的每一列的限制都不同。我试图通过更改 DataGrid
的 OnAutoGeneratingColumn
方法中的 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()
完成,而不是它正在工作!