【问题标题】:Change the foreground of a datagrid cell更改数据网格单元格的前景
【发布时间】:2016-08-02 12:17:40
【问题描述】:

我打开我的数据网格,在某些列上以黑色显示数值,在其他列上以红色写入相同的数据,只是说那里没有真正存在的值,没有被编辑。如果有人把红色的数字改成了黑色。

我已经在 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 的列) 提前致谢。

没有任何关于问候的提示?!好的,我会以更笼统的方式提出这个问题。 比方说,我想在每次更改单元格内容时以编程方式更改单元格的前景(不依赖于单元格中写入的值),正确的方法是什么?

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

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

    【讨论】:

    • 没有。请给个提示,我该怎么办?谢谢
    • xml 编辑器甚至在编译器说“WPF 项目中不支持 DynamicResource”之前就已经...
    【解决方案2】:

    首先,通过实现INotifyPropertyChanged 将更改通知应用到您的D3StatusVal 属性。

    如果您将目标类型明确设置为DataGridCellBasedOn 将不起作用。 而是将您的样式更改为:

    <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>
    

    【讨论】:

    • @G.Zana 我检查了这两种方法。
    • @G.Zana 请看答案的最后一部分。
    • 谢谢@Anjum,正如你所建议的,最后这只是 NotifyProperty 的问题,我的第一种方法也很好。
    • @G.Zana 好的,如果对您有帮助,请标记答案。
    • 可能我一获得声望就会被标记出来。
    猜你喜欢
    • 2012-09-30
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2011-12-23
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多