引用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])。因此,我必须手动设置数据网格中每个列的样式。由于我想在几个数据网格中使用这种样式,所以在我看来这是非常不切实际的。

因此,我的问题是,是否可以定义样式,使其根据单元格的值进行更改?或者有没有一种完全不同的方式来实现我忽略的目标?

谢谢你的帮助。

引用Elementstyle中的列表值

乍一看,您可以对所有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

所以决定权在你。