快速(我希望)问题。 我有这个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
答案 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并应用此样式,或者您可以使用ElementStyle
和EditingElementStyle
属性设置绑定格式
<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访问这两个值,我会创建两个列,一个是十进制的,具有完整的精度,另一个是一个带有两个小数的字符串。您可以根据需要显示/隐藏列,以便在适当的时间显示相应的版本。