2012-04-02 78 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