当用户进行编辑时,我正在更改单元格的背景颜色。我想在保存(或恢复)更改时将所有单元格返回正常颜色。
设置单元格的原始背景颜色(存储在父行中)非常简单。但我无法弄清楚如何遍历表中的所有单元格来重置它们。
我在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我需要更改背景颜色。
简而言之,我如何循环遍历行和单元格以便重置背景属性?
答案 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>