读书人

请问WPF高手 DataGrid 滚动时候为什

发布时间: 2013-10-13 14:03:53 作者: rapoo

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

上代码:
.xmal:—ataGrid没有重写任何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)
{
data.UpdateLayout();
data.ScrollIntoView(rowContainer, data.Columns[strongWindCellIndex_Y[i]]);
data.UpdateLayout();
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_Y[i]);
}
cell.Foreground = Brushes.Red;
}
} WPF? wpf datagrid
[解决办法]
WPF 是双向通知的,你的指定的单元格红色是否和滚动条属性有关,如有关,肯定是滚动时 滚动条的值发生变化,单元格也就跟着发生变化
[解决办法]

引用:
要实现:DataGrid中满足给定条件的单元格的字体颜色为红色,

如果是wpf的话可以考虑mvvm
把你的datagrid.itemssource = datatable.defaltview换下
直接加一个数据展示层vm 然后用你的datatable去初始化vm的list或者observablecollection
然后去绑定datagrid复杂的判断和逻辑都放在vm里面去做


界面上直接用datatemplate绑定datatrigger判断就行
多简单直接 不要觉得直接绑定datatable你就减少了工作 实际上绕的更加远

读书人网 >C#

热点推荐