【问题标题】:Conditional Formatting in WPF DataGridCellWPF DataGridCell 中的条件格式
【发布时间】:2012-01-26 16:52:39
【问题描述】:

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

有人知道如何实现这种条件格式吗?我编写了一个转换器,可以检查小数是否存在,但我无法弄清楚如何在我的 XAML 中将它应用到我的单元格样式或我的文本列。

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

<Style x:Key="MyCellStyle" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>

Grid Column - 我将应用应用于此列的样式

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

我尝试通过向我的单元格样式添加一个数据触发器来做到这一点,如下所示,但我收到一条错误消息,指出“在类型 'System.Windows.Controls.DataGridCell' 上找不到样式属性 'StringFormat'。”

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

我这几天一直在反对这个问题,所以任何关于解决这个问题的最佳方法的指导都将不胜感激。

【问题讨论】:

    标签: wpf formatting styles datagridcell


    【解决方案1】:

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

    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,如果成功则返回它(作为字符串)。如果没有,它会尝试一个双精度并返回它——在这里你可以指定任何字符串格式来获得所需的小数位数等。最后,如果它不能解析,它将返回原始值。

    然后您可以使用以下方法在您的列上设置:

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

    注意:您需要在资源中的某处使用MyConverter 键实例化转换器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多