WPF datagrid货币格式转换器

时间:2017-02-14 00:00:46

标签: wpf string-formatting ivalueconverter

我正在尝试在WPF数据网格中创建一个列,以下列格式显示货币:

value <= 9999, display format set to $1,234;
value <= 99999, display format set to $12k;
value >99999, display format set to $12M;

此外,我需要具有用户可以看到实际值的功能,并在鼠标单击时编辑该值。

我一直试图获得IValueConverter的概念,但无法获得正常工作的代码。

有人可以帮忙吗?

更新:根据Ramin的回答,它正在部分运作。 以下是代码:

public class DollarConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double v = double.Parse(value.ToString());

        if (v <= 9999)
        {
            return v.ToString("C0");
        }
        else if (v <= 999999)
        {
            double vv = v / 1000;
            return vv.ToString("C0") + "K";
        }
        else if (v > 99999)
        {
            double vvv = v / 1000000;
            return vvv.ToString("C0") + "M";
        }

        return v;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
WPF中的

Binding="{Binding LBRRev, Converter={StaticResource DollarConverter}}"

2 个答案:

答案 0 :(得分:0)

这不是确切的解决方案,但可以帮助您解决问题:

public class StringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int v = int.Parse(value.ToString());

        if (v <= 9999)
            return v.ToString("C0");
        else if (v <= 99999)
            decimal vv = v / 1000;
            return vv.ToString("C0") + "k"; 
        return v;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在装订中使用它:

 <DataGridTextColumn  Binding="{Binding Converter={StaticResource StringFormatConverter }}"/>

答案 1 :(得分:0)

经过一番研究,我现在有一个工作版本。 转换器:

public class DollarConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {            
        double v = double.Parse(value.ToString());

        if (v <= 9999)
        {
            return v.ToString("C0");
        }
        else if (v <= 999999)
        {
            return (v/1000).ToString("C0")+"K";
        }
        else if (v > 999999)
        {
            return (v/1000000).ToString("C1") + "M";
        }


        return v;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        throw new NotImplementedException();
    }
}

在xaml中:

<DataGridTemplateColumn Header="Mat. Rev" Width = "22*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding MatRev, Converter={StaticResource DollarConverter}}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=MatRev, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn> 

希望这有助于任何有同样问题的人。