Как да задам цвета на текста на 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')

Какво трябва да направя, за да работи?


person Arsen Zahray    schedule 08.06.2012    source източник
comment
опитвате ли се да зададете фон за цялата колона или отделни клетки в колона?   -  person Phil    schedule 08.06.2012
comment
Опитвам се да задам FOREGROUND за отделни клетки   -  person Arsen Zahray    schedule 08.06.2012


Отговори (3)


Трябва да посочите стил с 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's active" 
        IsNotMatchValue="It's 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>
person Phil    schedule 08.06.2012
comment
Е активно може да е нула. Как да уточня това? - person Arsen Zahray; 08.06.2012
comment
@ArsenZahray: добавен тригер за нула. Предполагам, че вашият конвертор на състояние обработва нули. - person Phil; 08.06.2012
comment
Извинения, тъй като съм нов в WPF. Получих неразрешена символна грешка за маркера Converters във вашия код, какъв друг код трябва да дефинирам? - person Danielle; 14.10.2014
comment
@DannyTan Converters е пространството от имена на BoolToTextConverter - не мога да си спомня дали съм създал някакъв реален код за това или не. - person Phil; 14.10.2014
comment
@Phil: Получавам следната грешка: Префиксът на пространството от имена „CONVERTER“ не е дефиниран. Можете ли да добавите кода, така че това да работи за всички? - person timunix; 25.10.2019

Въпреки че технически не съм DataGridTextColumn, обикновено правя това:

<DataGridTemplateColumn Header="Status" SortMemberPath="Status">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Status}" Foreground="{Binding Status, Converter={StaticResource StatusToSolidColor}}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Получавам контекста на данните, който искам, и мога да използвам повторно конвертори, които може би вече имам в останалата част от приложението. Освен това не е необходимо да кодирам/поддържам допълнителен набор от стилове и тригери за данни, за да постигна желания ефект.

person A.R.    schedule 26.06.2015

Предният план е четка, а не цвят. Може да анализира цвят в XAML, но това не се използва, когато създавате обвързване с конвертор.

Използвайте BoolToBrushConverter или създайте SolidColorBrush като преден план и обвържете неговото свойство "Color" с BoolToColorConverter. Така:

<DataGridTextColumn Header="Status">
    <DataGridTextColumn.Foreground>
        <SolidColorBrush Color="{Binding Path=IsActive, Converter={StaticResource BoolToColorConverter}}" />
    </DataGridTextColumn.Foreground>
</DataGridTextColumn>
person Trevor Elliott    schedule 08.06.2012
comment
Забелязах това, но проблемът ми е, че WPF вижда свойството IsActive в Binding и не го вижда на преден план. Междувременно модифицирах BoolToColorConverter, за да връща плътни четки вместо цветове - person Arsen Zahray; 08.06.2012