wpf datagrid 单元格颜色 根据条件改变颜色 根据表datatable动态显示datagrid内容

 最近要用wpf写程序,要改变datagrid的单元格颜色,根据条件改变颜色

废话不多说了,直接代码吧,都是很简单的代码。


 准备工作:添加一个颜色的值转换器。我这里写在window的资源文件了,只这个窗口使用。可以根据实际情况添加。(这个之前代码里面有,博客里写掉了,感谢 xhh325的提问

<Window.Resources>
        <local:ColorConvert x:Key="ColorConvert"/>
    </Window.Resources>


首先,datagrid控件设置好,主要是数据绑定,和值转换

<my:DataGrid AutoGenerateColumns="False" Margin="10,10,10,10" Name="dataGrid"  >
    <my:DataGrid.CellStyle >
        <Style TargetType="my:DataGridCell">
            <Style.Triggers >
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="White"></Setter>
                    <Setter Property="Foreground" Value="Black"/>
                    <Setter Property="BorderThickness" Value="0"></Setter>
                </Trigger>
                <Trigger Property="IsSelected" Value="False">
                    <Setter Property="Background" Value="White"></Setter>
                    <Setter Property="Foreground" Value="Black"/>
                    <Setter Property="BorderThickness" Value="0"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </my:DataGrid.CellStyle>
    <my:DataGrid.Columns>
        <my:DataGridTemplateColumn Header="xxx" >
            <my:DataGridTemplateColumn.CellTemplate>
                <DataTemplate >
                    <TextBlock Text="{Binding xxx}" Background="{Binding Path=xxx,Converter={StaticResource colorConvert}}"    Foreground="Black" />
                </DataTemplate>
            </my:DataGridTemplateColumn.CellTemplate>
        </my:DataGridTemplateColumn>
    </my:DataGrid.Columns>
</my:DataGrid>

然后,根据条件写好值转换器就行了

namespace xxx
{
    //定义值转换器
    [ValueConversion(typeof(string), typeof(string))]
    public class ColorConvert : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string strValue = value.ToString();
            if (strValue == "红色警报")
            {
                return "Red";
            }
          

            return "White";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {

            return "";
        }
    }
}

 

总结一下,主要注意3点:
1、根据条件定义一个值转换颜色的类
2、在xaml利用定义值转换类的静态资源,方面后面使用
3、绑定数据

之前,我很多博客都是直接代码,没有很多文章描述,也没有完整例子,因为我通常只看关键技术点,然后能把这些东西拼凑成我想要的(这些博客主要是想对自己以后的方便吧)。
今天看到xhh325留言说有异常,至于什么原因引起的,我不知道他的代码,也不清楚什么原因。于是,总结了上面3个关键点吧,并写了个简单的小例子(http://download.csdn.net/source/3461165),以供参考。


在我刚编辑完博客不久,xhh325又提出的新的要求:DataGrid需要动态绑定一个DataTable数据源,而且DataTabel的列是不确定的,需要根据最后一列的内容判定颜色,”完成“显示绿色,其它显示红色
其实,主要是把xaml写的代码,换成c#的,如下:
// 初始化dataGrid2
        void InitDataGrid2()
        {
            // 知道动态得到的dt,动态显示到datagrid
            int colCount = dt.Columns.Count;
            for (int i = 0; i < colCount; ++i )
            {
                string colName = dt.Columns[i].ToString();
                DataGridTemplateColumn column = new DataGridTemplateColumn();
                column.Header = colName;


                DataTemplate dataTemplate = new DataTemplate();
                FrameworkElementFactory tbContent = new FrameworkElementFactory(typeof(TextBlock));
                // 设置内容
                tbContent.SetValue(TextBlock.TextProperty, new Binding(colName));
                // 文字颜色
                tbContent.SetValue(TextBlock.ForegroundProperty, Brushes.Black);
                // 背景颜色
                Binding bindBackColor = new Binding(colName);
                bindBackColor.Converter = new ColorConvert();
                tbContent.SetValue(TextBlock.BackgroundProperty, bindBackColor);
                // 单元格长度,用浮点数。3.5版本下用整数会异常,其他版本不清楚
                tbContent.SetValue(TextBlock.WidthProperty, 100.0);
                dataTemplate.VisualTree = tbContent;

                column.CellTemplate = dataTemplate;

                dataGrid2.Columns.Add(column);
            }

        }
至于他的要求,我就不写了。根据上面改一改就可以了。新上传的例子:http://download.csdn.net/source/3462049(http://alsmile.download.csdn.net/)

你可能感兴趣的:(datagrid,object,WPF,setter,binding,DataTemplate)