WPF DataGridCell中的条件格式

WPF DataGridCell中的条件格式,wpf,formatting,styles,datagridcell,Wpf,Formatting,Styles,Datagridcell,我试图在WPF数据网格上应用一些条件格式。对于网格上的任何单元格,如果内容是整数,则显示格式应为零位小数。如果内容有小数位,则将其显示为stringformat中定义的默认值 有人知道我如何实现这种条件格式吗?我已经编写了一个转换器,可以检查小数的存在,但我无法确定如何在XAML中将其应用于单元格样式或文本列 单元格样式-这是我想要定义的样式 <Style x:Key="MyCellStyle" TargetType="DataGridCell"> <Setter Pr

我试图在WPF数据网格上应用一些条件格式。对于网格上的任何单元格,如果内容是整数,则显示格式应为零位小数。如果内容有小数位,则将其显示为stringformat中定义的默认值

有人知道我如何实现这种条件格式吗?我已经编写了一个转换器,可以检查小数的存在,但我无法确定如何在XAML中将其应用于单元格样式或文本列

单元格样式-这是我想要定义的样式

<Style x:Key="MyCellStyle" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
我试图通过如下方式将datatrigger添加到我的单元格样式中来实现这一点,但出现了一个错误,指出“在类型“System.Windows.Controls.DataGridCell”上找不到样式属性“StringFormat”



我已经为此绞尽脑汁好几天了,希望您能给我一些指导,告诉我如何处理这个问题。

您的转换器当前正在返回一个布尔值,以指示它是否可以解析字符串值中的整数。相反,您应该尝试以下方法:

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
键实例化转换器


如果希望能够指定默认的小数位数,可以将其作为转换器参数传入。

转换器当前正在返回一个布尔值,以指示是否可以从字符串值解析整数。相反,您应该尝试以下方法:

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
键实例化转换器

如果希望能够指定默认的小数位数,可以将其作为转换器参数传入

<DataGridTextColumn x:Key="ColumnName"
                Header="ColumnName"
                SortMemberPath="MyColumnSort"
                Binding="{Binding myColBinding, Converter={StaticResource MyConverter}}"
                IsReadOnly="True"
                Width="40" />