Установка цвета фона DataGrid на основе предыдущей строки - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь настроить сетку, где я делаю сортировку столбцов, но я хотел сделать чередование зебр, только вместо каждой другой строки или каждой х строк, я хочу, чтобы это было основано на значении предыдущей строки. все строки, которые содержат 0, имеют синий фон, следующее значение будет иметь белый фон, следующее значение будет синим и т. д.

Проблема, с которой я столкнулся, заключается в том, что я не могу найти, где на самом деле выполнить настройку цветов фона. Я использую пользовательский сортировщик, и я попытался установить его там после того, как я переупорядочил список и установил источник данных, но кажется, что когда источник данных установлен, строки еще не существуют. Я пытался использовать 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;
    }
  }
}
    }
  }
}

1 Ответ

1 голос
/ 02 апреля 2012

Добавьте обработчик для 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;
    }
}

Затем вы можете сбросить значения для isColorOne и previousValue при необходимости при сортировке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...