基于单元格值的DataGrid行背景

时间:2011-09-11 22:29:43

标签: c# wpf xaml wpfdatagrid

我目前正在开发一个C#WPF数据网格。我有一个DataGrid,它有自动生成的列,代码连接到SQLite数据库并创建数据集,然后将此数据集设置为DataGrid ItemsSource。

下面是使用DataGrid的XAML的代码

<DataGrid AutoGenerateColumns="True"
          Margin="12,71,12,32"
          Name="tblLog"
          ColumnWidth="*"
          CanUserResizeRows="False"
          AreRowDetailsFrozen="False"
          CanUserAddRows="True"
          CanUserDeleteRows="True"
          IsReadOnly="True"
          MouseDoubleClick="tblLog_MouseDoubleClick">                
</DataGrid>

以下是为DataGrid设置ItemsSource的代码

try
{
    DataSet ds = new DataSet();
    SQLiteDataAdapter da = new SQLiteDataAdapter(query, db.conn);
    da.Fill(ds);

    //tblGrid.AutoGenerateColumns = true;
    tblGrid.ItemsSource = ds.Tables[0].DefaultView;                    
}
catch (SQLiteException ex)
{
    MessageBox.Show("Unable to retrieve logins from database.\n\n" + ex.Message + "\n\nError Code: " + ex.ErrorCode);
}

数据库中显示的列(自动生成)是ID,日期,时间,状态。 我需要做的是,如果状态列的行中的值等于错误,则更改该行的背景颜色。

我假设我需要在DataGrid标记中添加某种样式标记和DataTriggers,但不确定我需要什么。我尝试过设置ItemsSource的代码的任何内容都会显示一条错误,指出Source在添加ItemsSource之前需要为空。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:20)

您可以使用DataTrigger执行此操作。

这是一个快速示例。我创建了一个名为Person的类,其属性为Name,Age和Active。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool Active { get; set; }
}

在主窗口的构造函数中,我将3个Person个对象添加到列表中,然后将该列表绑定到DataGrid

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Person> people = new List<Person>();
        people.Add(new Person() 
        { 
            Name = "John Doe",
            Age = 32,
            Active = true
        });
        people.Add(new Person()
        {
            Name = "Jane Doe",
            Age = 30,
            Active = true
        });
        people.Add(new Person()
        {
            Name = "John Adams",
            Age = 64,
            Active = false
        });
        tblLog.ItemsSource = people;
    }
}

然后在MainWindow的XAML中,我创建了一个DataTrigger样式作为资源。

<Window.Resources>
    <Style TargetType="DataGridRow">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Active}" Value="False">
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

此触发器的作用是从DataGridRow中的Active对象获取Person字段的值,如果该值为false,则转为行的背景颜色变红了。