您可能需要使用自定義列,那麼你可以將整個行傳遞給一個轉換器,同時使用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();
}
}
你知道你的數據上下文或ItemsSource將用於網格嗎? AutoGenerateColumns的一部分就是我認爲它不能用於模板的地方。 – 2011-04-05 19:20:41
是的,我的ItemSource是一個帶有List(Of MyCustomPOCO)的ViewModel屬性 – GilShalit 2011-04-05 19:26:53