日期:2014-05-17  浏览次数:20894 次

请教WPF高手 DataGrid 滚动时候为什么用后台代码定义的样式会变
  要实现:DataGrid中满足给定条件的单元格的字体颜色为红色,
在窗体show之前就完成datagrid数据初始化 :datagrid.itemssource = datatable.defaltview
我在生成datatable的时候就记录了所有需要标红的单元格的索引
在窗体show之后执行了一个函数,实现DataGrid中上述索引的单元格Foreground为红
  问题:
完事后表格中的这些单元格字体确实变红了,但是!!!我上下滚动了以后(表格没设左右滚动)这些单元格的样式居然变了,某些该红的不红了,不该红的变红了,每次滚动都会变,而且看不出变的规律。有大神遇到过或看得明白这个问题么??求赐教
  注:看过网上的一些方法说这个问题可通过设置datagrid的单元格数据触发器(DataTriger什么的)实现,但我的单元格内容不是简单数字,而是类似“7.0XXXX\R\NXXX”之类的,要在前面的数字大于某个值的时候标红,所以觉得触发器也很难实现。

上代码:
.xmal:(DataGrid没有重写任何WPF预定义的事件)
<DataGrid Name="data" FontSize="14" HeadersVisibility="Column" IsReadOnly="True" Foreground="Black" VerticalScrollBarVisibility="Hidden" CanUserSortColumns="False" CanUserReorderColumns="False">
</DataGrid>

.xmal.cs:
window.show()之前就是根据规则生成数据表DataTable,然后标记需要标红的单元格索引,然后初始化datagrid
show()之后实现单元格变红的代码:
-------------------------------------------割------------------------------------
public void setDataCellStyle()
        {
            //这个循环是根据之前记录的单元格索引找到需要标红的单元格,改变他们的样式
            for (int i = 0; i < strongWindCellIndex_X.Count; i++)
            {
                DataGridRow rowContainer = (DataGridRow)data.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_X[i]);
                if (rowContainer == null)
                {
                    data.UpdateLayout();
                    data.ScrollIntoView(data.Items[strongWindCellIndex_X[i]]);
                    data.UpdateLayout();
                    rowContainer = (DataGridRow)data.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_X[i]);
                    if (rowContainer == null)
                        continue;
                }
                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_Y[i]);
                if (cell == null)
                {
                   &nbs