Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于上一行设置DataGrid背景色_C#_Wpf - Fatal编程技术网

C# 基于上一行设置DataGrid背景色

C# 基于上一行设置DataGrid背景色,c#,wpf,C#,Wpf,我正在尝试设置一个网格,在其中进行列排序,但我想进行斑马条纹,而不是每隔一行或每x行,我希望它基于前一行的值。i、 e.所有包含0的行都有蓝色背景,下一个值将有白色背景,下一个值将是蓝色,等等 我的问题是,我似乎找不到在哪里实际设置背景色。我正在使用一个自定义分类器,在我重新排序列表并设置数据源后,我尝试将其设置在那里,但当设置数据源时,行似乎还不存在。我尝试使用DataContextChanged,但该事件似乎没有触发 这是我现在拥有的 namespace Foo.Bar { public

我正在尝试设置一个网格,在其中进行列排序,但我想进行斑马条纹,而不是每隔一行或每x行,我希望它基于前一行的值。i、 e.所有包含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;
    }
  }
}
    }
  }
}
名称空间Foo.Bar
{
公共部分类FooBar
{
列表结果列表{get;set;}
SolidColorBrush stripeOneColor=新的SolidColorBrush(Colors.Gold);
SolidColorBrush StripeThoColor=新的SolidColorBrush(Colors.White);
//*********************************************************************************************
公共一致性()
{
初始化组件();
}
//*********************************************************************************************
覆盖受保护的void PopulateTabWithData()
{
ResultList=GetBlas();
SortAndGroup(“来源”);
}
//*********************************************************************************************
私有void排序组(字符串colName)
{
IORDerenumerable ordered=null;
开关(colName)
{
案例“来源”:
案例“ID”:
ordered=ResultList.OrderBy(r=>r.Source),然后是by(r=>r.ID);
打破
案例“名称”:
ordered=ResultList.OrderBy(r=>r.Source),然后是by(r=>r.Name);
打破
案例“信息”:
ordered=ResultList.OrderBy(r=>r.Message);
打破
违约:
抛出新异常(colName);
}
ResultList=ordered.ThenBy(r=>r.Source).ThenBy(r=>r.ID).ToList();//连接断路器
consistencyDataGrid.ItemsSource=null;
consistencyDataGrid.ItemsSource=ResultList;
ColorRows();
}
//*********************************************************************************************
私有无效一致性数据网格_排序(对象发送方,System.Windows.Controls.DataGridSortingEventArgs e)
{
SortAndGroup(例如Column.Header.ToString());
e、 已处理=正确;
}
私有void ColorRows()
{
对于(var i=0;i0)
{
var-previousItem=ResultList[i-1];
var previousRow=myDataGrid.ItemContainerGenerator.ContainerFromItem(previousItem)作为DataGridRow;
if(currentItem.Source==previousItem.Source)
{
row.Background=previousRow.Background;
}
其他的
{
if(previousRow.Background==stripeOneColor)
{
row.Background=条带颜色;
}
其他的
{
row.Background=stripeOneColor;
}
}
}
其他的
{
row.Background=stripeOneColor;
}
}
}
}
}
}

添加用于加载行的处理程序,并将颜色逻辑放在那里:

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
的值。

添加用于加载行的处理程序,并将颜色逻辑放在那里:

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
的值。

如果您的行颜色基于任何行值,您只需使用单元格样式来设置行背景色。在这种情况下,我不关心单元格/行的值是什么,我只关心它是否与以前的单元格/行不同。所以我真正想要的是条带化,而不是基于值的着色。然后解决这个问题,就像你说的“我希望它基于单元格的值”。如果您的行颜色基于任何行值,您只需使用单元格样式设置行背景颜色。在这种情况下,我不关心单元格/行的值是什么,我只关心它是否与上一个单元格/行不同。所以我真正想要的是条带化,而不是基于值的着色。然后解决这个问题,就像你说的“我希望它基于单元格的值”。如果你想给单元格或行上色,请明确。@Maslow我认为这是不可能的,因为在为一个项目设置模板时,它不知道任何其他项目。我能看到的最接近的方法是向绑定对象添加一些颜色属性,在根据需要的任何规则构建对象时设置颜色,然后在xaml中使用该颜色属性的绑定。这是否说明了虚拟化?我和你有问题it@Maslow根据我的理解,它的行为应该与指定背景设置相同。您是否注意到您的应用程序与
virtualizangstackpanel.isvirtualization=“False”
?@Maslow的行为有任何不同?我认为这是不可能的,因为在为项目设置模板时,它不知道任何其他项目。我能看到的最接近的方法是向绑定对象添加一些颜色属性,在根据需要的任何规则构建对象时设置颜色,然后在xaml中使用该颜色属性的绑定。这是否说明了虚拟化?我和你有问题it@Maslow根据我的理解,它的行为应该与指定背景设置相同。您是否注意到您的应用程序在使用
virtualzingstackpanel.isvirtualization=“False”
时的行为有任何不同?