Click here to Skip to main content
15,888,527 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I want to change datagrid row background color, by taking value from Database. I have 2 value "ERROR" and "OK". If Column string value is ERROR then row color will b red. and ik OK then It must b Green. This value get from database by firing query. I have this values in dataset. How to do this?? I tried below code

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


Viewmodel

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


Simple Class
C#
public class myItem
{
    public string Status { get; set; }
    public string Name { get; set; }
}


Dispatcher Class

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



Converter

C#
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();
}


I just Want to bind dataset column to trigger. If trigger get ERROR string then backgrounfrow color change to red. and vice vrsa.
Posted
Comments
stibee 24-Feb-15 2:51am    
Do you have some binding errors?
Dipika Wani 24-Feb-15 4:05am    
yes I get error that item collection must be empty befour using when I attach datatable to datagried
E.g- datagried1.ItemSource= dt. defaultview

1 solution

 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900