我希望以红色显示所有负数(在xamdatagrid中),我不想按字段分配样式字段,而应将样式应用于所有数字列。是否有任何通用的写入方式风格。
所以对于ex:通常我们做
<Style TargetType="{x:Type igDP:CellValuePresenter}" x:key = "MyFieldStyle">
blah
</Style>
...
<field Name = field1 cellstyle= MyFieldStyle/>
<field style= MyFieldStyle/>
...
因此,我不是逐字段地应用,而是可以写一些要应用于所有数字列的内容吗?
答案 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();
}
}
}
结果
修改强>
这里是请求的解决方法,在这种方法中,您不需要专门为单个列设置样式
<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();
}
}
}
结果
上述方法将基于DataGridTextColumn
用于此类数字的假设而有效,如果TextBlock
或TextBox
不是{{1}}或{{1}},则可能不适用于其他类型的列或模板列模板的第一个视觉效果。