2011-04-05 38 views
1

說我有一個DataGrid有5列,從一個custome類集合中加載(使用AutoGenerateColumns = True)。基於在第一,第三和第四列的值,我需要設置行的背景與下列選項之一:如何根據列值設置WPF DataGrid行的部分背景顏色?

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

你知道你的數據上下文或ItemsSource將用於網格嗎? AutoGenerateColumns的一部分就是我認爲它不能用於模板的地方。 – 2011-04-05 19:20:41

+0

是的,我的ItemSource是一個帶有List(Of MyCustomPOCO)的ViewModel屬性 – GilShalit 2011-04-05 19:26:53

回答

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(); 
    } 
} 
+0

謝謝,所以你同意N8在上面的評論,我不能使用AutoGenerateColumns? – GilShalit 2011-04-05 19:33:35

+0

我沒有用DataGrids做過多的工作,但是如果你使用AutoGenerateColumns,你對單個部件的訪問很少,也許有一些方法可以做到,但這對我來說似乎更直接。 – 2011-04-05 19:44:02

+0

H.B.,你能舉一個實際轉換器的例子嗎?我有問題。我不需要內部邏輯,但需要接口和聲明部分。非常感謝您的幫助 – GilShalit 2011-04-07 19:35:12

0

如果你想有一個後端代碼解決方案,我相信你可以得到LoadingRow事件,以檢查各行的DataContext的,並找到生成的單元格也是如此。儘管如此,我還沒有這樣做!

+0

這是一個很好的想法,但是當AutoGenerateColumns = true時,事件似乎並不奏效。所以,如果是這種情況,我可能會與自定義列的建議。 – GilShalit 2011-04-06 06:52:15

+0

啊,很高興知道。感謝信息 – 2011-04-06 16:34:08

+0

實際上,無論AutoGenerateColumns是true還是false,這似乎都不起作用。請參閱http://forums.silverlight.net/forums/p/218179/520231.aspx#520231,主持人的回答。 – GilShalit 2011-04-07 16:19:13

相關問題