假设我有一个包含5列的DataGrid,从自定义类集合中加载(使用AutoGenerateColumns = True)。根据第一,第三和第四列中的值,我需要使用以下选项之一设置行的背景:
col num: 1 2 3 4 5
Option1: gray gray gray gray gray
Option2: gray red red gray gray
Option3: gray gray gray red red
Option4: gray blue blue blue blue
这需要分别对每一行进行。
我已经看到了为行背景设置转换器的一些示例,但是如何设置单个单元格背景?
答案 0 :(得分:2)
您可能需要使用自定义列,然后您可以将整行传递到转换器,同时使用ConverterParameter
指定当前列,这样您就可以比较所有值:
<DataGridTextColumn Binding="{Binding Column1}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background"
Value="{Binding Converter={StaticResource ValueToBrushConverter},
ConverterParameter=1}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Column2}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background"
Value="{Binding Converter={StaticResource ValueToBrushConverter},
ConverterParameter=2}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!-- ... -->
我不是那个你的表,但你可能想出如何在转换器中自行返回正确的值。
转换器骨架可能是这样的:
public class ValueToBrushConverter : IValueConverter
{
/// <summary>
/// 1st Indexer: Columns
/// 2nd Indexer: Options
/// </summary>
Brush[,] _brushMatrix = new Brush[5,4]
{
{ Brushes.Gray, Brushes.Gray, Brushes.Gray, Brushes.Gray },
{ Brushes.Gray, Brushes.Red, Brushes.Gray, Brushes.Blue },
{ Brushes.Gray, Brushes.Red, Brushes.Gray, Brushes.Blue },
{ Brushes.Gray, Brushes.Gray, Brushes.Red, Brushes.Blue },
{ Brushes.Gray, Brushes.Gray, Brushes.Red, Brushes.Blue }
};
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
RowDataItem item = value as RowDataItem;
int currentColumn = int.Parse(parameter as string);
int currentRowOption;
#region Internal logic here, e.g
if (item.Col1 == "I" && item.Col3 == "Love" && item.Col2 == "Converters")
{
currentRowOption = 1;
}
//...
#endregion
return _brushMatrix[currentColumn, currentRowOption];
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
答案 1 :(得分:0)
如果您需要后端代码解决方案,我确信您可以获取LoadingRow事件来检查单个行的datacontext,并以此方式查找生成的单元格。我之前没有这样做过!