C# 网格中数值的常规样式
我想以红色显示所有负数(在xamdatagrid中),我不想逐个字段分配样式,而应该将样式应用于所有数字列。是否有编写样式的通用方法 所以对于ex:通常我们是这样的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
<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();
}
}
}