您可能需要使用自定义列,然后您可以将整行传递给转换器,同时使用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();
}
}