我有一个 DataGrid,它通过 DataSet 从数据库中填充其数据。现在,我需要做的是根据单元格的值和一系列其他因素为单元格的背景着色。
在花了两天的大部分时间在互联网上搜索之后,我决定使用 IValueConverter 来执行此操作。编写我的代码后,代码执行良好;我已经测试并看到 1) 正在调用 IValueConverter 类,并且 2) 它确实返回了画笔颜色。
我的问题是在运行时没有使用应用的画笔调色板对单元格进行着色。
奇怪的是,我知道某些东西正在起作用,因为当我选择每一行时,应该以不同于默认“选择蓝色”的颜色(在本例中为亮白色)突出显示应该着色的单元格。因此,无论出于何种原因,尽管单元格正在转换并调用 IValueConverter,但布局并未显示它。我还执行了另一项测试,我只是将 CellStyle 设置为纯色(在本例中为 LimeGreen)并完全忽略 IValueConverter,并且单元格 DID 出现在 Lime-Green 中。这让我相信 Binding 和 Convert() 之间的某个地方出了点问题。
我对为什么没有显示转换颜色感到非常困惑,并且我已经用尽了谷歌前几页中的每个搜索结果,所以我希望这里有人可以看看我的代码并准确地指出我为什么 DataGrid 以这种方式行事。
DataTable dt = new DataTable();
dt = ((DataSet)ItemSource).Tables[0];
int counter = 0;
foreach (DataColumn dc in dt.Columns)
{
switch(dc.ColumnName)
{
(....)
case "SEAPCT":
DataGridTextColumn col2 = new DataGridTextColumn();
col2.Header = (((DataSet)ItemSource).Tables[0].Columns[counter].ToString()).Replace("PCT", "%");
col2.Binding = new Binding(dc.ColumnName);
Style style = new Style(typeof(DataGridCell));
Setter setter = new Setter();
setter.Property = DataGridCell.BackgroundProperty;
Binding b = new Binding(dc.ColumnName);
b.Converter = new PercentCellConverter();
setter.Value = b;
style.Setters.Add(setter);
col2.CellStyle = style;
DashboardGrid.Columns.Insert(counter, col2);
counter++;
break;
}
}
DashboardGrid.ItemsSource = dt.DefaultView;
}
而且,作为参考,我的 IValueConverter 类:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string n = value.ToString();
System.Diagnostics.Debug.WriteLine(n);
if (double.Parse(n) > 0)
return Brushes.LimeGreen;
else if (double.Parse(n) == 0)
return Brushes.Yellow;
else
return Brushes.Red;
}