Сетка данных WPF Цвет ячейки в зависимости от значения предыдущей ячейки - PullRequest
5 голосов
/ 29 мая 2011

Фон.

Я занимаюсь разработкой приложения для торговли акциями.Которые, очевидно, имеют рыночные часы.Я разрабатываю эти рыночные часы, используя Datagrid.

Что делает Grid?Отображает ценовые точки акции.Каждый раз, когда стоимость акций увеличивается, передний план конкретной ячейки становится зеленым, если он уменьшается, он становится красным.

Что я сделал?Я пытался использовать метод преобразования значений и многосвязные

Проблема.Преобразователь значений выдает только текущее значение.Как я могу передать старое значение этому конвертеру.

Код:

 <wpfTlKit:DataGrid.CellStyle>
            <Style TargetType="{x:Type wpfTlKit:DataGridCell}">
                <Setter Property="Background">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource  myHighlighterConverter}" 
                                      >
                            <MultiBinding.Bindings>
                                <Binding RelativeSource="{RelativeSource Self}"></Binding>
                                <Binding Path="Row" Mode="OneWay"></Binding>
                                <Binding ElementName="OldData" Path="Rows"></Binding>
                            </MultiBinding.Bindings>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
        </wpfTlKit:DataGrid.CellStyle>

Конвертер

public class HighlighterConverter : IMultiValueConverter
{
    #region Implementation of IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[1] is DataRow)
        {
            //Change the background of any cell with 1.0 to light red.
            var cell = (DataGridCell)values[0];
            var row = (DataRow)values[1];
            var columnName = cell.Column.SortMemberPath;

            if (row[columnName].IsNumeric() && row[columnName].ToDouble() == 1.0)
                return new SolidColorBrush(Colors.LightSalmon);

        }
        return SystemColors.AppWorkspaceColor;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }

    #endregion
}

public static class Extensions
{
    public static bool IsNumeric(this object val)
    {
        double test;
        return double.TryParse(val.ToString(), out test);
    }

    public static double ToDouble(this object val)
    {
        return Convert.ToDouble(val);
    }
}

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Чтобы изменить цвет в ячейке 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));
    }
  }
}
0 голосов
/ 29 мая 2011

ну, я думаю, что проблема не в сетке данных, а в объекте, к которому вы привязываетесь.если вы связываетесь с таблицей данных, старые значения встроены (DataRowVersion).если у вас есть другие объекты сущностей, то эти сущности должны поддерживать исходные и измененные значения.

...