网格中数值的通用样式

时间:2014-08-12 06:38:25

标签: c# wpf styles

我希望以红色显示所有负数(在xamdatagrid中),我不想按字段分配样式字段,而应将样式应用于所有数字列。是否有任何通用的写入方式风格。

所以对于ex:通常我们做

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

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

 ...   

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

1 个答案:

答案 0 :(得分:1)

我尝试使用转换器和样式触发器

的解决方案

这是一个示例

<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>

您需要做的就是在相对列上应用样式,您可能还需要根据需要更新触发器绑定。

转换器类

namespace CSharpWPF
{
    class SignConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double outValue;
            if (value != null && double.TryParse(value.ToString(), out outValue))
                return Math.Sign(outValue);
            return DependencyProperty.UnsetValue;
        }

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

结果

result


修改

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

<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();
        }
    }
}

结果

result

上述方法将基于DataGridTextColumn用于此类数字的假设而有效,如果TextBlockTextBox不是{{1}}或{{1}},则可能不适用于其他类型的列或模板列模板的第一个视觉效果。