Чтобы изменить цвет в ячейке DataGrid, я рекомендую следующее:
Создание модели, которая реализует INotifyPropertyChanged, который содержит текущую и предыдущую цену, а также свойство, которое отражает изменение цены (я приложил полную модель в конце этого ответа).
public double ChangeInPrice
{
get
{
return CurrentPrice - PreviousPrice;
}
}
И установите фон CellTemplate в вашей DataGrid на основе изменения цены с помощью конвертера.
Примечание: INotifyPropertyChanged помогает изменить цвет ячейки при изменении значений цены.
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Path=CurrentPrice}"
Background="{Binding Path=ChangeInPrice, Converter={StaticResource backgroundConverter}}" >
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
[ValueConversion(typeof(object), typeof(SolidBrush))]
public class ObjectToBackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush b = Brushes.White;
try
{
double stock = (double)value;
if (stock > 0)
{
b = Brushes.Green;
}
else if (stock < 0)
{
b = Brushes.Red;
}
}
catch (Exception e)
{
}
return b;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Вот полная модель для полноты:
public class Stock : INotifyPropertyChanged
{
public Stock(string stockName, double currentPrice, double previousPrice)
{
this.StockName = stockName;
this.CurrentPrice = currentPrice;
this.PreviousPrice = previousPrice;
}
private string _stockName;
public String StockName
{
get { return _stockName; }
set
{
_stockName = value;
OnPropertyChanged("StockName");
}
}
private double _currentPrice = 0.00;
public double CurrentPrice
{
get { return _currentPrice; }
set
{
_currentPrice = value;
OnPropertyChanged("CurrentPrice");
OnPropertyChanged("ChangeInPrice");
}
}
private double _previousPrice = 0.00;
public double PreviousPrice
{
get { return _previousPrice; }
set
{
_previousPrice = value;
OnPropertyChanged("PreviousPrice");
OnPropertyChanged("ChangeInPrice");
}
}
public double ChangeInPrice
{
get
{
return CurrentPrice - PreviousPrice;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}