引用Elementstyle中的列表值
本文关键字:列表 Elementstyle 引用 | 更新日期: 2023-09-27 18:27:42
在stackoverflow上找到了很多帮助后,我现在正努力解决一个还找不到答案的问题。我的目标是:
我在wpf/c#应用程序中有一个数据网格,里面充满了数字。根据图形是正还是负,我想将前景字体更改为绿色或红色。数据网格的项源是我自己的类的列表,其中包括以下元素:
- 字符串描述
- 一份名为totalMoney的12双双打名单
我已经手动配置了数据网格的列,这样第一个显示描述,然后是totalMoney[0]的值,然后是totalMoney[1]等等。经过一些搜索,我找到了一种方法,通过数据触发方法加上IValueConverter,通过以下代码,基于stackoverflow上的值来更改单个单元格的前景颜色:
<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中,我必须将绑定引用到我的列表中的单个项目(totalMoney[X])。因此,我必须手动设置数据网格中每个列的样式。由于我想在几个数据网格中使用这种样式,所以在我看来这是非常不切实际的。
因此,我的问题是,是否可以定义样式,使其根据单元格的值进行更改?或者有没有一种完全不同的方式来实现我忽略的目标?
谢谢你的帮助。
乍一看,您可以对所有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]),但使用上面的样式,它将依赖于Textblock
显示的Text
!
所以决定权在你。