如何使用从wpf中的数据库中获取的值更改数据网格行背景颜色

how to change datagrid row background color with value taken from database in wpf

我想通过从数据库中获取值来更改数据网格行的背景颜色。 我有 2 个值 "ERROR" 和 "OK"。如果 Column string 值为 ERROR,则行颜色将为红色,如果 OK,则它必须为 Green。该值通过执行查询从数据库中获取。我在数据集中有这些值。我不清楚如何实现?

我试过下面的代码:

<Window x:Class="stackDatagridColor.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewModels="clr-namespace:stackDatagridColor"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <viewModels:viewmodel x:Key="viewmodel"/>
    <viewModels:BrushConverter x:Key="BrushConverter"/>
</Window.Resources>
<Grid>
    <StackPanel>
        <DataGrid ItemsSource="{Binding Collection, Mode=TwoWay, Source={StaticResource viewmodel}, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Status}" Value="ERROR">
                            <Setter Property="Background" Value="Red"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Status}" Value="OK">
                            <Setter Property="Background" Value="Green"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
        </DataGrid>
    </StackPanel>
</Grid>

视图模型:

public class viewmodel : INotifyPropertyChanged
{

    private ObservableCollection<myItem> collection;
    public ObservableCollection<myItem> Collection
    {
        get { return collection; }
        set { collection = value; OnPropertyChanged("Collection"); }
    }


    public viewmodel()
    {
        Collection = new ObservableCollection<myItem>();
        myItem item1 = new myItem { Name = "name1", Status = "OK" };
        myItem item2 = new myItem { Name = "name2", Status = "ERROR" };
        DispatchService.Invoke(() =>
            {
                Collection.Add(item1);
            Collection.Add(item2);
            });
    }


    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

简单Class

public class myItem
{
    public string Status { get; set; }
    public string Name { get; set; }
}

调度员class

public static class DispatchService
{
    public static void Invoke(Action action)
    {
        Dispatcher dispatchObject = Application.Current.Dispatcher;
        if (dispatchObject == null || dispatchObject.CheckAccess())
        {
            action();
        }
        else
        {
            dispatchObject.Invoke(action);
        }
    }
}

转换器:

public class BrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string input = value as string;
        switch (input)
        {
            case "ERROR":
                return Brushes.Red;
            case "OK":
                return Brushes.Green;
            default:
                return DependencyProperty.UnsetValue;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

我只想绑定数据集列来触发。如果触发器获得错误字符串,则背景行颜色变为红色,反之亦然。

首先Collection 属性应该这样声明:

public DataSet Collection { ... }

ItemSource XAML 中的绑定也应更改:

ItemsSource="{Binding Path=Collection.Tables[Table1], Mode=OneWay,...

在上面的代码中,Table1 是您要绑定到的数据集中的 table 的名称。要测试此代码,请按以下方式创建一个简单的数据集:

 public viewmodel()
 {
        var tb = new DataTable("Table1");
        tb.Columns.Add("Status");
        tb.Columns.Add("Name");

        tb.Rows.Add("OK", "name1");
        tb.Rows.Add("ERROR", "name2");
        tb.Rows.Add("ERROR", "name3");

        Collection2 = new DataSet();
        Collection2.Tables.Add(tb);
 }

我得到了我的答案...没有这些东西的新东西..只是使用了 loadingrow 事件。这非常有用。 见下文

DataGridRow row = e.Row;
DataRowView rView = row.Item as DataRowView
if(rView != null && rView.Row.ItemArray[4].ToString().Contains("ERROR")) 
{
  e.row.Background= new SolidColorBrush(Color.Red);
}
else
{
 e.row.Background= new SolidColorBrush(Color.Green);
}