基于单元格值的DataGrid行背景

9
我目前正在处理一个 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的代码进行任何更改都会显示错误,指出必须在添加ItemsSource之前将源清空。
感谢您提供的任何帮助。

我们样式化单元格和行的方式是使用未命名的未键控样式。当我们指定它们的TargeType时,它们适用于所有元素。 - WPF-it
1个回答

27

您可以使用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中Person对象的Active字段的值,如果该值为false,则将该行的背景颜色变为红色。


谢谢你的帮助。但是当数据表格从数据库中获取时,这个方法该如何运作呢?这看起来像是在代码中手动分配字段。如果使用数据库绑定,这个方法该如何运作呢?抱歉,我对这方面还是有些新手。 - Boardy
@Boardy...它应该完全一样。我只是将数据集合绑定到DataGrid。本质上,这与使用数据库数据进行绑定时DataSet所做的事情是相同的。 - Ryan Alford
非常棒,非常感谢您的帮助。我之前有些困惑,因为我认为样式是在DataGrid标记内完成而不是Window.Resources中完成的。再次感谢您的帮助。 - Boardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接