我打开我的数据网格,在某些列上显示黑色的数值,相同的数据在其他列上以红色显示,只是说没有值存在于那里,尚未编辑。如果有人用红色改变数字,他们应该变成黑色。
我在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) 提前谢谢。
对此没有任何暗示?!好的,我会以更一般的方式提出问题。 比方说,我希望每次更改其内容时都以编程方式更改单元格的前景(不依赖于单元格中的值写入),这样做的正确方法是什么?
答案 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>