在stackoverflow上找到了很多帮助后,我现在正在努力解决一个我无法找到答案的问题。我的目标如下:
我在wpf / c#应用程序中有一个数据网格,里面有数字。取决于数字是正数还是负数,我想将前景字体更改为绿色或红色。 datagrid的itemsource是我自己的类的列表,其中包含以下元素:
我手动配置了datagrid的列,以便第一个显示描述,然后是totalMoney [0]的值,然后是totalMoney [1],依此类推。经过一些搜索,我找到了一种方法来改变单个单元格的前景色,这是基于stackoverflow上的值,通过datatrigger方法和IValueConverter,使用以下代码:
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding totalMoney[2], Converter={StaticResource money}}" Value="1">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding totalMoney[2], Converter={StaticResource money}}" Value="0">
<Setter Property="Foreground" Value="Black"/>
</DataTrigger>
<DataTrigger Binding="{Binding totalMoney[2], Converter={StaticResource money}}" Value="-1">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
但是,正如您在代码中看到的那样,在WPF中,我必须将Binding引用到List中的单个项目(totalMoney [X])。因此,我必须手动为数据网格中的每个列设置样式。由于我想在几个数据网格中使用这种风格,这在我看来非常不实用。
我的问题是 - 是否可以定义样式,以便它根据一般单元格的值而改变?或者是否有一种完全不同的方式来实现我忽略的目标?
感谢您的帮助。
答案 0 :(得分:0)
乍一看,您可以对所有totalMoney []列使用以下样式...
<Style TargetType="{x:Type TextBlock}" x:Key="MoneyIndicatorStyle">
<Style.Triggers>
<DataTrigger
Binding="{Binding Text, RelativeSource={RelativeSource Self},
Converter={StaticResource money}}"
Value="1">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger
Binding="{Binding Text, RelativeSource={RelativeSource Self},
Converter={StaticResource money}}"
Value="0">
<Setter Property="Foreground" Value="Black"/>
</DataTrigger>
<DataTrigger
Binding="{Binding Text, RelativeSource={RelativeSource Self},
Converter={StaticResource money}}"
Value="-1">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
但是这里有一个潜在的捕获 ...如果明天您决定这些文本块的文本将是这样的格式化货币...... $(1,00) 即会计世界负100美元,那么转换器可能必须将此格式化的字符串转换为区域中性数字,即-100.00,并根据转换器中的当前逻辑产生0,1或-1。
现在您的转换器很轻松,因为它从您的模型中收到一个简单的数值(totlaMoney [n]),但使用上述样式它将依赖Text
显示的Textblock
!
所以决定权归你所有。