Как изменить цвет фона ячейки с помощью WPF Toolkit Datagrid
Я использую набор инструментов инструментария WPF, и я хотел бы установить цвет фона ячейки, а не строки, на основе содержимого ячейки.
Для простоты, скажем, столбец называется Foo, и я хотел бы, чтобы фон ячейки был синим, когда Foo - 1, красный, когда Foo - 2, желтый, когда Foo - 3 и зеленый, когда Foo - больше 3.
Если я смогу это сделать, я уверен, что смогу решить любой из более сложных случаев, с которыми мне нужно иметь дело.
Ответы
Ответ 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>
Может пригодиться людям в моей ситуации.