显示货币时保留所有小数位,但仅显示两位小数

3

快速(我希望如此)提问。我有一个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。


你是否也尝试使用数据注释 DisplayFormat?http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.displayformatattribute(v=vs.95).aspx - Klaus78
2个回答

6

使用 StringFormat 或单向的 Converter 不应该改变实际值。这两个只用于显示目的。

例如,这将以货币格式显示小数值,并保留2位小数点,但不会将 SomeDecimal 截断到两位小数。

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

也许您想要使用两个数字来显示一个值,但是需要使用完整的四个数字进行编辑。如果是这种情况,我建议使用样式触发器,在编辑时显示未格式化的值。

<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并在其中放置一个应用了此样式的文本框,或者您可以使用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>

抱歉,离开了几天,现在正在建设中。但看起来是完美的答案。只是尝试稍微调整一下以适应我的DataGrid,自动生成的列等等。 - Daanvl
在文本框上它可以正常工作。但是我似乎无法让它在自动生成的数据网格单元格上工作。 - Daanvl
@Daanvl 我原以为第一种语法会起作用,但既然不行,你可能需要使用 DataGridTemplateColumn 而不是 DataGridTextColumn,并直接将样式应用于 TextBox - Rachel
好的,我会去看一下。但是为什么数据网格单元格的背景颜色和文本块/框内部的前景颜色受到样式而不是字符串格式的影响呢?我想我要查看一些输出转储。 - Daanvl
我会尝试一下,但我的雇主希望我继续前进。不过希望我能在周五之前发布结果... - Daanvl
显示剩余4条评论

-1

我的第一反应是使用一个包含两个小数位的字符串,然后使用填充数据表格的结构来获取完整精度。

如果您确实需要从数据表格中访问这些值,我建议创建两列,其中一列是具有完整精度的小数,另一列是一个包含两个小数位的字符串。您可以根据需要显示/隐藏列,以便在适当的时候显示相应版本。


看起来有点像是一种hack...而且对于一个有70多列,其中10多列是货币的网格来说,性能并不理想。 - Daanvl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接