我正在尝试在WPF DataGrid上应用一些条件格式。要求如下。对于网格上的任何单元格,如果内容是整数,则显示格式应为零小数位。如果内容具有小数位,则将它们显示为stringformat中定义的默认值。
有没有人知道如何实现这种条件格式?我已经编写了一个转换器,可以检查是否存在小数,但是我无法弄清楚如何在我的XAML中将其应用到我的单元格样式或文本列中。
单元格样式 - 这是我想要定义的样式
<Style x:Key="MyCellStyle" TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
网格列 - 我将应用应用于此列的样式
<DataGridTextColumn x:Key="ColumnName"
Header="ColumnName"
SortMemberPath="MyColumnSort"
Binding="{Binding myColBinding, StringFormat={}{0:N2}}"
IsReadOnly="True"
Width="40" />
转换器 - 我会使用此转换器来确定是否应用此样式。
public class NoDecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int converted;
int.TryParse(value.ToString(), out converted);
value.ToString();
return int.TryParse(value.ToString(), out converted);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我尝试通过向我的单元格样式添加数据触发器来实现,如下所示,但是我收到错误声明&#34;无法找到样式属性&#39; StringFormat&#39;在类型&#39; System.Windows.Controls.DataGridCell&#39;。&#34;
<Style x:Key="MyCellStyle" TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Style.Triggers>
<DataTrigger Binding="{Binding NoDecimalConvertor}" Value="False" >
<Setter Property="StringFormat" Value="true" />
</DataTrigger>
</Style.Triggers>
</Style>
我几天来一直在反对这一点,所以任何指导都会得到最好的解决方法。
答案 0 :(得分:4)
您的转换器当前正在返回一个布尔值,以指示它是否可以解析字符串值中的整数。相反,你应该尝试这样的事情:
public class NoDecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int converted;
if (int.TryParse(value.ToString(), out converted))
return converted.ToString();
double convertedDouble;
if (double.TryParse(value.ToString(), out convertedDouble))
return convertedDouble.ToString();
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
这将首先尝试解析int,如果成功则返回它(作为字符串)。如果没有,它将尝试一个double并返回它 - 在这里你可以指定任何字符串格式来获得所需的小数位数等。最后,如果它不能解析它将返回原始值。
然后,您可以使用以下方式在列上设置:
<DataGridTextColumn x:Key="ColumnName"
Header="ColumnName"
SortMemberPath="MyColumnSort"
Binding="{Binding myColBinding, Converter={StaticResource MyConverter}}"
IsReadOnly="True"
Width="40" />
注意:您需要使用密钥MyConverter
在资源中的某个位置实例化转换器。
如果您希望能够指定默认的小数位数,可以将其作为转换器参数传递。