C# 网格中数值的常规样式

C# 网格中数值的常规样式,c#,wpf,styles,C#,Wpf,Styles,我想以红色显示所有负数(在xamdatagrid中),我不想逐个字段分配样式,而应该将样式应用于所有数字列。是否有编写样式的通用方法 所以对于ex:通常我们是这样的 <Style TargetType="{x:Type igDP:CellValuePresenter}" x:key = "MyFieldStyle"> blah </Style> ... <field Name = field1 cellstyle= MyFieldS

我想以红色显示所有负数(在xamdatagrid中),我不想逐个字段分配样式,而应该将样式应用于所有数字列。是否有编写样式的通用方法

所以对于ex:通常我们是这样的

 <Style TargetType="{x:Type igDP:CellValuePresenter}" x:key = "MyFieldStyle">     
    blah   
 </Style>

 ...
 <field Name = field1 cellstyle= MyFieldStyle/> 
 <field style= MyFieldStyle/> 

 ...   

废话
...
...   

因此,我可以编写一些应用于所有数字列的内容,而不是逐个字段应用吗?

我尝试了使用转换器和样式触发器的解决方案

这是一个样本

<DataGrid xmlns:l="clr-namespace:CSharpWPF">
    <DataGrid.Resources>
        <l:SignConverter x:Key="SignConverter" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Numeric Value"
                            Binding="{Binding}">
            <DataGridTextColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Converter={StaticResource SignConverter}}"
                                     Value="-1">
                            <Setter Property="Foreground"
                                    Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGridTextColumn.CellStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Header="String Value"
                            Binding="{Binding SomeProperty,FallbackValue=String Value}" />
    </DataGrid.Columns>
    <sys:Double>-13</sys:Double>
    <sys:Double>13</sys:Double>
    <sys:Double>-1</sys:Double>
    <sys:Double>-3</sys:Double>
    <sys:Double>3</sys:Double>
    <sys:Double>0</sys:Double>
</DataGrid>
结果


编辑

这里是一个针对请求的解决方案,在这种方法中,您不需要专门为单个列设置样式

<DataGrid xmlns:l="clr-namespace:CSharpWPF" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <DataGrid.Resources>
        <l:SignConverter x:Key="SignConverter" />
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Content.Text, RelativeSource={RelativeSource Self}, Converter={StaticResource SignConverter}}"
                             Value="-1">
                    <Setter Property="Foreground"
                            Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Numeric Value"
                            Binding="{Binding [0]}" />
        <DataGridTextColumn Header="String Value"
                            Binding="{Binding [1]}" />
    </DataGrid.Columns>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>-13</sys:Double>
        <sys:String>hello</sys:String>
    </x:ArrayExtension>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>-1</sys:Double>
        <sys:String>hello 2</sys:String>
    </x:ArrayExtension>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>1</sys:Double>
        <sys:String>hello 3</sys:String>
    </x:ArrayExtension>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>0</sys:Double>
        <sys:String>hello 4</sys:String>
    </x:ArrayExtension>
</DataGrid>
结果


上述方法将基于以下假设工作:
DataGridTextColumn
用于此类数字,如果
TextBlock
TextBox
不是模板的第一个可视项,则该方法可能不适用于其他类型的列或模板列

你用的是什么网格?尝试在默认的datatemplate中使用DataTemplateSelector来设置这些字段。你打算使用任何转换器吗?@pusp:我可以使用转换器,但可以有很多数字列,因此如何发送每列的值?谢谢你的解决方案。但这就是我的全部观点。我有50列,其中20+是数字,我不想应用手动为每个列(如u)设置的样式为“数值”字段使用了不同的样式。或者甚至提到每个属性的样式。问题是指定绑定,在这种情况下,我们可以尝试其他方法,让我试试解决方法
<DataGrid xmlns:l="clr-namespace:CSharpWPF" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <DataGrid.Resources>
        <l:SignConverter x:Key="SignConverter" />
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Content.Text, RelativeSource={RelativeSource Self}, Converter={StaticResource SignConverter}}"
                             Value="-1">
                    <Setter Property="Foreground"
                            Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Numeric Value"
                            Binding="{Binding [0]}" />
        <DataGridTextColumn Header="String Value"
                            Binding="{Binding [1]}" />
    </DataGrid.Columns>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>-13</sys:Double>
        <sys:String>hello</sys:String>
    </x:ArrayExtension>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>-1</sys:Double>
        <sys:String>hello 2</sys:String>
    </x:ArrayExtension>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>1</sys:Double>
        <sys:String>hello 3</sys:String>
    </x:ArrayExtension>
    <x:ArrayExtension Type="{x:Type sys:Object}">
        <sys:Double>0</sys:Double>
        <sys:String>hello 4</sys:String>
    </x:ArrayExtension>
</DataGrid>
namespace CSharpWPF
{
    class SignConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string text = value as string;
            double outValue;
            if (text != null && double.TryParse(text, out outValue))
                return Math.Sign(outValue);
            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}