Фон строки DataGrid на основе значения ячейки - PullRequest
7 голосов
/ 12 сентября 2011

В настоящее время я работаю над сеткой данных C # WPF.У меня есть DataGrid, который имеет автоматически сгенерированные столбцы, и код подключается к базе данных SQLite и создает набор данных, а затем этот набор данных устанавливается в качестве источника данных DataGrid.

Ниже приведен код с XAML DataGrid

<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>

А ниже приведен код для установки ItemsSource для DataGrid

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);
}

Столбцы, которые являютсяв базе данных (автоматически сгенерированные) отображаются идентификатор, дата, время, статус.То, что мне нужно сделать, это если значение в строке столбца состояния равно Ошибка, изменить цвет фона этой строки.

Я предполагаю, что мне нужно добавить какие-то теги стилей и DataTriggers в теги DataGrid, но я не уверен, что мне нужно.Все, что я пробовал в коде, который устанавливает ItemsSource, отображает ошибку, говорящую о том, что Source должен быть пустым перед добавлением ItemsSource.

Спасибо за любую помощь, которую вы можете предоставить.

1 Ответ

20 голосов
/ 12 сентября 2011

Вы можете использовать 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;
    }
}

Затем в XAML для MainWindow я создаю стиль 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>

Что этот триггер делает, это берет значение изActive поле из объекта Person, находящегося в DataGridRow, и если это значение равно false, то цвет фона строки становится красным.

...