2012-04-02 90 views
1

我想設置一個網格,我在那裏做列排序,但我想做斑馬條紋,而不是每隔一行或每x行,我想它基於前一行的值。即包含0的所有行都有一個藍色的背景,下一個值將有一個白色的背景,下一個值將是藍色等...基於前一行設置DataGrid背景顏色

我的問題是,我似乎無法找到在哪裏實際上做背景顏色的設置。我使用的是自定義分類器,在重新排列列表並設置數據源之後,我嘗試將它設置在那裏,但似乎在設置數據源時,這些行還不存在。我嘗試使用DataContextChanged,但該事件似乎並沒有被解僱。

這是我現在擁有的。

namespace Foo.Bar 
{ 
    public partial class FooBar 
    { 
    List<Bla> ResultList { get; set; } 
    SolidColorBrush stripeOneColor = new SolidColorBrush(Colors.Gold); 
    SolidColorBrush stripeTwoColor = new SolidColorBrush(Colors.White); 

    //********************************************************************************************* 
    public Consistency() 
    { 
     InitializeComponent(); 
    } 

    //********************************************************************************************* 
    override protected void PopulateTabWithData() 
    { 
     ResultList = GetBlas(); 
     SortAndGroup("Source"); 
    } 

    //********************************************************************************************* 
    private void SortAndGroup(string colName) 
    { 
     IOrderedEnumerable <Bla> ordered = null; 
     switch (colName) 
     { 
     case "Source": 
     case "ID": 
      ordered = ResultList.OrderBy(r => r.Source).ThenBy(r => r.ID); 
      break; 
     case "Name": 
      ordered = ResultList.OrderBy(r => r.Source).ThenBy(r => r.Name); 
      break; 
     case "Message": 
      ordered = ResultList.OrderBy(r => r.Message); 
      break; 
     default: 
      throw new Exception(colName); 
     } 

     ResultList = ordered.ThenBy(r => r.Source).ThenBy(r => r.ID).ToList(); // tie-breakers 
     consistencyDataGrid.ItemsSource = null; 
     consistencyDataGrid.ItemsSource = ResultList; 
     ColorRows(); 
    } 

    //********************************************************************************************* 
    private void consistencyDataGrid_Sorting(object sender, System.Windows.Controls.DataGridSortingEventArgs e) 
    { 
     SortAndGroup(e.Column.Header.ToString()); 
     e.Handled = true; 
    } 

    private void ColorRows() 
{ 
    for (var i = 0; i < ResultList.Count; i++) 
    { 
    var currentItem = ResultList[i]; 
    var row = myDataGrid.ItemContainerGenerator.ContainerFromItem(currentItem) as DataGridRow; 
    if (row == null) 
    { 
     continue; 
    } 
    if (i > 0) 
    { 
     var previousItem = ResultList[i - 1]; 
     var previousRow = myDataGrid.ItemContainerGenerator.ContainerFromItem(previousItem) as DataGridRow; 
     if (currentItem.Source == previousItem.Source) 
     { 
     row.Background = previousRow.Background; 
     } 
     else 
     { 
     if (previousRow.Background == stripeOneColor) 
     { 
      row.Background = stripeTwoColor; 
     } 
     else 
     { 
      row.Background = stripeOneColor; 
     } 
     } 
    } 
    else 
    { 
     row.Background = stripeOneColor; 
    } 
    } 
} 
    } 
    } 
} 
+0

如果你的rowcolor是基於任何行值,你可以簡單地使用單元格樣式來設置你的行背景顏色 – blindmeis 2012-04-02 17:34:22

+0

在這種情況下,我不在乎單元格/行的值是多少,我只關心它是否有差異來自上一個單元格/行。所以我真正想要的是條紋,而不是基於價值的着色。 – Zipper 2012-04-02 17:55:52

+0

然後解決問題,因爲您聲明「我希望它基於單元格的值」。如果你想爲單元格或行着色,請清楚。 – Paparazzi 2012-04-02 18:16:36

回答

1

添加處理程序LoadingRow,把你的顏色邏輯有:

bool isColorOne = false; 
var previousValue = null; 
private consistencyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    // Check current value against previous value 
    if (previousValue == e...) 
    { 
     previousValue = e...; 
     isColorOne = !isColorOne; 
    } 
    if (isColorOne) 
    { 
     row.Background = stripeOneColor; 
    } 
    else 
    { 
     row.Background = stripeTwoColor; 
    } 
} 

然後你就可以在分揀isColorOnepreviousValue必要時重新設定值。

+0

你能在xaml中做到這一點嗎? – Maslow 2012-11-06 15:27:40

+0

@Maslow我不會認爲這是可能的,因爲當爲一個項目設置模板時,它不知道任何其他項目。最近我可以看到即將添加一些顏色屬性到綁定對象,根據您需要的任何規則構建對象時設置顏色,然後使用綁定到xaml中的該顏色屬性。 – 2012-11-06 15:34:15

+0

是否爲此虛擬化完成此帳戶?我遇到問題 – Maslow 2012-11-06 17:26:05