循环遍历Xceed DataGrid中WPF的所有单元格?

时间:2010-01-21 15:51:32

标签: c# wpf xceed-datagrid

当用户进行编辑时,我正在更改单元格的背景颜色。我想在保存(或恢复)更改时将所有单元格返回正常颜色。

设置单元格的原始背景颜色(存储在父行中)非常简单。但我无法弄清楚如何遍历表中的所有单元格来重置它们。

我在Xceed知识库中发现了一篇名为“How to iterate through the grid's rows”的文章......你认为这篇文章是完美的,对吧?错误;文章中提到的.DataRows.FixedHeaderRows等属性(或方法)来自an older/defunct Xceed product

This forum thread建议使用DataGrid的.Items属性,在我的例子中返回System.Data.DataRowView的集合...但是我找不到任何方法来强制转换它(或者它的任何相关内容)元素)直到Xceed.Wpf.DataGrid.DataCell我需要更改背景颜色。

简而言之,我如何循环遍历行和单元格以便重置背景属性?

3 个答案:

答案 0 :(得分:4)

由于Mohamed, an Xceed employee who posted on the Xceed Forums,问题已得到解决。示例代码如下:

foreach (object item in this.DataGrid1.Items)
{
    Dispatcher.BeginInvoke(new Action<object>(RemoveRowHighlights), DispatcherPriority.ApplicationIdle, item);
}
...
private void RemoveRowHighlights(object item)
{
    Xceed.Wpf.DataGrid.DataRow row = this.DataGrid1.GetContainerFromItem(item) as Xceed.Wpf.DataGrid.DataRow;
    if (row != null) foreach (Xceed.Wpf.DataGrid.DataCell c in row.Cells)
    {
        if (c != null) c.Background = row.Background;
    }
}

答案 1 :(得分:1)

我建议您更改业务逻辑以改为使用数据绑定。

数据网格中的每个单元格都是一个对象,它本身知道它是否已被编辑过。然后您可以将数据绑定到该属性,因此当您保存并重置所有对象时,状态也将在您的gui中更新。

此外,您可以免费分离关注点。您现在可以决定事物应该如何查看,而不是跟踪保存/未保存的业务逻辑应该是什么。

答案 2 :(得分:0)

建议的方法是通过隐式样式触发器(因为UI虚拟化),并且Xceed DataGrid上的所有属性都是可设置的,除了由DataGrid上定义的主题强加的属性。

e.g。 :

  <Style TargetType="{x:Type xcdg:DataCell }">
     <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsDirty}"
                     Value="True">
           <Setter Property="Background"
                   Value="DeepSkyBlue" />
        </DataTrigger>
     </Style.Triggers>
  </Style>