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

Мне нравится XAMPP, лично. У меня есть установка, работающая на карте флэш-памяти, которую я ношу вокруг, это - в значительной степени моя среда разработки для сети ЛАМПЫ dev на любой машине, которая я, оказывается, в (я нахожусь главным образом на клиентских машинах Windows).

Маленький, полностью функциональный, и стабильный - работает действительно хорошо на мои потребности.

23
задан Dave Clemmer 28 August 2011 в 18:44
поделиться

2 ответа

Это делается с помощью стилей и триггеров данных. Просто установите 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, но, как правило, иметь в модели данных специфичную для пользовательского интерфейса информацию, такую ​​как цвета, - плохая идея, поэтому это не рекомендуется.

40
ответ дан 29 November 2019 в 01:43
поделиться

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

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

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

6
ответ дан 29 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: