改变DataGrid单元格颜色

来源:互联网 发布:js for 循环 异步函数 编辑:程序博客网 时间:2024/05/20 16:01

      WPF中经常使用DataGrid来显示表格数据,我的做法是把数据先放在一个DataTable中,然后再绑定到DataGrid中,以后要读写数据就直接操作DataTable,DataGrid仅仅是一个显示容器。

绑定代码:

dataGrid.ItemsSource = dataTable.DefaultView;

      DataGrid的DataRowLoading事件中,可以改变某一行的整体颜色,但是现在我希望DataGrid中的文字能够按照一定的规则显示不同的颜色,每一列都有自己的规则,例如第一列的数据大于100为红色,小于60为蓝色,否则为绿色;第二列的数据大于200为红色,小于160为蓝色,否则为绿色。这又该怎么做呢?

      这需要从IMultiValueConverter派生一个类,定义颜色的规则,然后在xaml中将每一列的单元样式制作好,并传入必要的列参数,最后在DataRowLoading时用后台代码将DataGrid的列样式指定(因为DataGrid的内容是后台动态加载的,因此必须动态指定样式)。


1、IMultiValueConverter派生类

public class DataGridValueConverterMulti : IMultiValueConverter    {        public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)        {                    }        public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)        {            throw new NotImplementedException();        }    }

先不急研究此代码,结合xaml中的样式看看。


2、xaml中定义的样式

        <Style x:Key="dataGridColumnStyleMulti重量" TargetType="DataGridCell">            <Setter Property="Foreground">                <Setter.Value>                    <MultiBinding Converter="{StaticResource dataGridValueConverterMulti}" ConverterParameter="weight">                        <Binding Path="重量"></Binding>                        <Binding Path="样品牌号"></Binding>                    </MultiBinding>                </Setter.Value>            </Setter>        </Style>
请注意{StaticResource dataGridValueConverterMulti}也是在xaml中定义的

<local:DataGridValueConverterMulti x:Key="dataGridValueConverterMulti" />
我给这个来自“local命名空间”的类DataGridValueConverterMulti取了一个key,以便于在定义DataGridCell样式的时候进行指定。意思就是DataGridCell的样式中使用了一个MultiBinding,而该Binging的转换器,就是第一步在后台代码中派生的类DataGridValueConverterMulti。请注意类中的第一个函数:

public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)

xaml中的weight就是传入该函数的第三个参数object parameter, xaml中还绑定了两个path,重量和样品牌号,一定是在DataGrid中存在的列名,并把对应的数据传入Convert的第一个参数object[] value中。为什么要传入两个path呢,第一个重量是指当前单元格的值,而第二个样品牌号是我用来计算颜色规则的参数。


3、将datagrid的cellstyle指定为xaml中定义的style

      在后台DataRowLoading中加入类似下面的代码:

dg.Columns[0].CellStyle = (Style)FindResource("dataGridColumnStyleMulti重量");

目的是对dg的列进行CellStyle指定,因为我的后台数据是动态绑定到DataGrid中的,所以只能在DataRowLoading是进行样式指定。


4、总结

      以上描述的方法中,DataGrid存在两个列:重量和样品牌号,我希望重量列的所有内容都能根据同一行的样品牌号列内容来计算并显示不同的颜色,于是我先在后台继承IMultiValueConverter编写了颜色转换规则,再在xaml中声明这个转换类,通过MultiBinding把运用于DataGridCell的样式中,同时我指定一个样式参数为weight,并绑定了两个Path(表示重量列的值和样品牌号的值),最后在后台将重量列的CellStyle进行指定。

      如果我还有列A,列B也希望通过样品牌号列来进行颜色计算显示怎么办?很简单,重复步骤2,3即可,只不过为了彼此区分,我会把ConverterParameter的值改一下,还记得吗,xaml中的这个字段直接传入函数Convert的第二个参数,这样我就可以区分是重量列,还是A列,还是B列,从而指定对应的颜色方案。







0 0
原创粉丝点击