更改数据网格单元格的前景

时间:2016-08-02 12:17:41

标签: wpf datagrid

我打开我的数据网格,在某些列上显示黑色的数值,相同的数据在其他列上以红色显示,只是说没有值存在于那里,尚未编辑。如果有人用红色改变数字,他们应该变成黑色。

我在xaml中为DatagridCell编写了一种样式 -

<Window.Resources>
    <Style x:Key="D3ForegroundStyle" TargetType="{x:Type DataGridCell}" >
        <Setter Property="Foreground" Value="Black" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=D3StatusVal}" Value="inherited">
                <Setter Property="Foreground" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

D3StatusVal它是一个字符串,其值可以是“正常”或“继承”。 样式以这种方式链接到列:

                <DataGridTextColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource D3ForegroundStyle}"/>
                </DataGridTextColumn.CellStyle>

第一次,在我打开窗口后不久,datagrid已按照我喜欢的方式填充,因此使用D3StatusVal的值,某些值显示为黑色其他红色。在此之后如果我尝试更改单元格的数据没有任何反应(我的意思是单元格颜色),即使更改了D3StatusVal的值,也会调用一个PropertyChanged事件(带有x:name of column) 提前谢谢。

对此没有任何暗示?!好的,我会以更一般的方式提出问题。 比方说,我希望每次更改其内容时都以编程方式更改单元格的前景(不依赖于单元格中的值写入),这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用DynamicResouce而不是StaticResource

答案 1 :(得分:0)

首先,通过实施D3StatusVal将更改通知应用于INotifyPropertyChanged媒体资源。

如果您明确地将目标类型设置为BasedOn

DataGridCell将无法工作。 而是将您的风格改为:

<Style x:Key="D3ForegroundStyle">
    <Setter Property="DataGridCell.Foreground" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=D3StatusVal}" Value="inherited">
            <Setter Property="DataGridCell.Foreground" Value="Red" />
        </DataTrigger>
    </Style.Triggers>
</Style>

或将样式应用为:

        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
               <Setter Property="Foreground" Value="Black" />
               <Style.Triggers>
                  <DataTrigger Binding="{Binding Path=D3StatusVal}" Value="inherited">
                    <Setter Property="Foreground" Value="Red" />
                 </DataTrigger>
               </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>

要仅在特定列中更改颜色,请使用MultiDataTrigger检查Column.Header值(例如,下面使用Age列):

           <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=Age}" Value="12"/>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Age"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Foreground" Value="Yellow" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>