Как установить цвет текста DataGridTextColumn?
Я пытаюсь изменить цвет DataGridTextColumn.
Вот что я делаю:
<DataGridTextColumn
Header="Status"
Binding="{Binding IsActive,
Converter= {StaticResource BoolToStatusConverter}}"
Foreground="{Binding Path=IsActive,
Converter={StaticResource BoolToColorConverter}}"/>
Текст установлен правильно, но цвет не изменится, и я получаю следующую ошибку:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or
FrameworkContentElement for target element. BindingExpression:Path=IsActive;
DataItem=null; target element is 'DataGridTextColumn' (HashCode=40349079); target
property is 'Foreground' (type 'Brush')
Что я должен сделать для этого?
Ответы
Ответ 1
Вам нужно указать стиль с DataTrigger для столбца CellStyle. например
<Page.Resources>
<Style TargetType="DataGridCell" x:Key="ActiveCellStyle">
<Setter Property="Foreground" Value="Blue"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsActive}" Value="{x:Null}">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsActive}" Value="True">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Converters:BoolToTextConverter
x:Key="BoolToStatusConverter"
TargetCondition="True"
IsMatchValue="It active"
IsNotMatchValue="It dead" />
</Page.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn
Header="Status"
Binding="{Binding IsActive,
Converter={StaticResource BoolToStatusConverter}}"
CellStyle="{StaticResource ActiveCellStyle}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Ответ 2
Хотя это не технически DataGridTextColumn, это то, что я обычно делаю:
<DataGridTemplateColumn Header="Status" SortMemberPath="Status">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Status}" Foreground="{Binding Status, Converter={StaticResource StatusToSolidColor}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Я получаю datacontext, который я хочу, и я могу использовать конвертеры, которые, возможно, у меня уже есть в остальной части приложения. Более того, мне не нужно жестко кодировать/поддерживать дополнительный набор стилей и триггеры данных, чтобы получить желаемый эффект.
Ответ 3
Передний план - это кисть, а не цвет. Он может анализировать цвет в XAML, но не используется, когда вы создаете привязку с конвертером.
Используйте BoolToBrushConverter или создайте SolidColorBrush в качестве переднего плана и привяжите его свойство "Цвет" к BoolToColorConverter. Вот так:
<DataGridTextColumn Header="Status">
<DataGridTextColumn.Foreground>
<SolidColorBrush Color="{Binding Path=IsActive, Converter={StaticResource BoolToColorConverter}}" />
</DataGridTextColumn.Foreground>
</DataGridTextColumn>