以两位小数显示货币,但保留所有可用的小数

时间:2012-03-09 15:55:29

标签: c# wpf datagrid string-formatting

快速(我希望)问题。 我有这个DataGrid,包含一些货币列。我似乎无法找到的是如何以2位小数显示货币。但是在单元格中保持可能的3或4十进制值。如果尝试了一些字符串格式,但实际上会更改值。当然,IValueConverter也是如此。那我错过了什么?或者有人能指出我正确的方向吗?

编辑: 在建议之后我尝试了这样的事情。

 <Style x:Key="DecimalTextBlockStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="TextBlock.Text" Value="{Binding StringFormat={}{0:C}}"/>
        <Setter Property="TextBlock.Foreground" Value="Red"/>
        <Setter Property="Background" Value="AliceBlue"/>
    </Style>

并在此处申请:

if(e.PropertyType.FullName.Contains("Decimal"))
        {
            var cl = e.Column as DataGridTextColumn;
            if (cl != null)
            {
                //cl.Binding.StringFormat = "C2";
                Style Stl = (Style)FindResource("DecimalTextBlockStyle");
                cl.CellStyle = Stl;

            }}

但我没有得到的是为什么!这些列中的值是漂亮的红色文本,蓝色背景..但是未格式化的字符串,只显示0,000而不是€0,00

2 个答案:

答案 0 :(得分:6)

使用StringFormat或单向Converter不应更改实际值。这两者仅用于显示目的。

例如,这将以货币格式显示带有2位小数的十进制值,但不会将SomeDecimal修剪为两位小数

<TextBox Text="{Binding SomeDecimal, StringFormat=C2}" />

也许您希望使用2位数显示值,但使用完整的4位数进行编辑。如果是这种情况,我建议使用样式触发器在编辑时显示未格式化的值。

<Style x:Key="DecimalTextBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Text" Value="{Binding SomeDecimal, StringFormat=C2}" />
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="Text" Value="{Binding SomeDecimal}" />
        </Trigger>
    </Style.Triggers>
</Style>

修改

根据您的请求,要将此样式应用于DataGridCell,您可以使用DataGridTemplateColumn并在其中放置TextBox并应用此样式,或者您可以使用ElementStyleEditingElementStyle属性设置绑定格式

<DataGridTextColumn>
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Text" Value="{Binding SomeDecimal, StringFormat=C2}" />
        </Style>
    </DataGridTextColumn.ElementStyle>
    <DataGridTextColumn.EditingElementStyle>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Text" Value="{Binding SomeDecimal}" />
        </Style>
    </DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>

答案 1 :(得分:-1)

我的第一直觉是只有一个带有两位小数的字符串,并使用你用来填充数据网格的任何结构,如果你需要完整的精度。

如果你真的需要从DataGrid访问这两个值,我会创建两个列,一个是十进制的,具有完整的精度,另一个是一个带有两个小数的字符串。您可以根据需要显示/隐藏列,以便在适当的时间显示相应的版本。