Подтвердить что ты не робот

Как изменить цвет фона ячейки с помощью WPF Toolkit Datagrid

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

Для простоты, скажем, столбец называется Foo, и я хотел бы, чтобы фон ячейки был синим, когда Foo - 1, красный, когда Foo - 2, желтый, когда Foo - 3 и зеленый, когда Foo - больше 3.

Если я смогу это сделать, я уверен, что смогу решить любой из более сложных случаев, с которыми мне нужно иметь дело.

4b9b3361

Ответ 1

Вы делаете это со стилями и DataTriggers. Просто установите свой ElementStyle со свойством фона по умолчанию, в данном случае Green, и добавьте DataTriggers для других случаев:

<DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" >
  <DataGridTextColumn.ElementStyle>
    <Style TargetType="{x:Type TextBlock}">

      <Setter Property="Background" Value="Green" />

      <Style.Triggers>
        <DataTrigger Binding="{Binding Foo}" Value="1">
          <Setter Property="Background" Value="Blue" />
        </DataTrigger>

        <DataTrigger Binding="{Binding Foo}" Value="2">
          <Setter Property="Background" Value="Red" />
        </DataTrigger>

        <DataTrigger Binding="{Binding Foo}" Value="2">
          <Setter Property="Background" Value="Yellow" />
        </DataTrigger>

      </Style.Triggers>
    </Style>
  </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

Другой подход заключается в использовании привязки с конвертером:

<DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" >
  <DataGridTextColumn.ElementStyle>
    <Style TargetType="{x:Type TextBlock}">

      <Setter Property="Background"
        Value="{Binding Foo, Converter={x:Static my:FooToColorConverter.Instance}}" />

    </Style>
  </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

с этим преобразователем:

public class FooToColorConverter : IValueConverter
{
  public static readonly IValueConverter Instance = new FooToColorConverter();
  public object Convert(object value, ...
  {
    int foo = (int)value;
    return
      foo==1 ? Brushes.Blue :
      foo==2 ? Brushes.Red :
      foo==3 ? Brushes.Yellow :
      foo>3 ? Brushes.Green :
        Brushes.Transparent;  // For foo<1
  }
  public object ConvertBack(...
  {
    throw new NotImplementedException();
  }
}

Обратите внимание, что ответ serge_gubenko дал бы работать, но , только если ваше значение свойства Foo никогда не изменяется. Это связано с тем, что геттер свойства Color будет вызываться только один раз. Его решение можно улучшить, изменив Color на DependencyProperty только для чтения и обновив его всякий раз, когда назначается Foo, но, как правило, плохая идея иметь пользовательскую информацию, такую ​​как цвета в вашей модели данных, поэтому не рекомендуется.

Ответ 2

Один из способов сделать это - определить ElementStyle для столбца, а затем привязать фон textblock к свойству цвета элемента данных за строкой datagrid. Вот пример:

DataGridTextColumn xaml:

<DataGridTextColumn Width="SizeToCells"   
                       MinWidth="150" 
                       Binding="{Binding Name}">

    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextBlock.Background" Value="{Binding Color}" />
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

Объявление элемента данных:

public class TestItem
{
    public TestItem(int foo)
    {
        Foo = foo;
    }

    public int Foo { get; set; }
    public Brush Color
    {
        get
        {
            Color color = Colors.Green;
            switch (Foo)
            {
                case 1: color = Colors.Red; break;
                case 2: color = Colors.Yellow; break; 
            }
            return new SolidColorBrush(color);
        }
    }
}

надеюсь, что это поможет, считает

Ответ 3

serge_gubenko будет хорошо работать, если ваш объект наследует From INotifyPropertyChanged, тогда, когда ваше свойство изменит вызов NotifyPropertyChanged ( "yourproperty" )

Ответ 4

Несколько иной подход вместо того, чтобы нацеливать элемент TextBlock, который часто оставляет границу вокруг элемента управления, вместо этого на сам DataGridCell. В моем случае у меня уже был стиль, от которого я хотел унаследовать, мне просто нужно было изменить цвета фона в зависимости от значения:

<DataGridTextColumn 
    Width="*"
    Header="Status"
    Binding="{Binding EventStatus, Converter={StaticResource DescriptionAttributeConverter}}"
    HeaderStyle="{StaticResource DataGridColumnHeaderStyleCenterAligned}">

    <DataGridTextColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource DataGridCellStyleCenterAligned}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding EventStatus}" Value="1">
                    <Setter Property="Background" Value="Green" />
                </DataTrigger>

                <DataTrigger Binding="{Binding EventStatus}" Value="2">
                    <Setter Property="Background" Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>

Может пригодиться людям в моей ситуации.