在转换器 wpf 中将 double.NaN 转换为相关区域性
Posted
技术标签:
【中文标题】在转换器 wpf 中将 double.NaN 转换为相关区域性【英文标题】:converting double.NaN to the relevant culture in converter wpf 【发布时间】:2012-07-19 13:51:36 【问题描述】:当我们没有值时,有一个使用 doubl.NaN 插入的数据表。 我想要做的是每当我看到 double.Nan 我想把“-”代替,因此我有一个带有以下代码的转换器:
if (value.ToString() == double.NaN.ToString())
return "-";
一切都在“en-us”文化上完美运行,但是当我们使用不同的文化时(比如“zn-cn”) 它不起作用,因为 "double.NaN.ToString()" 结果是一个中文单词,其中 value.ToString() 是正常的 "NaN"。
我尝试使用转换器使用 double.parse(),但没有任何效果。
更新 - 好的,问题是转换器将对象作为字符串而不是 double 这是 Xaml:
<ControlTemplate TargetType="x:Type DataGridCell">
<Border Background="Transparent" Padding="10 8" BorderBrush="Transparent" BorderThickness="1">
<Border.Resources>
<Style TargetType="ToolTip">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="HasDropShadow" Value="False"/>
<Setter Property="VerticalOffset" Value="-46"/>
<Setter Property="HorizontalOffset" Value="10"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToolTip">
<General:TextTooltip TitleStyle="StaticResource NumericTableToolTipTitleStyle" Content="TemplateBinding Content" ContentStringFormat="G" ContentStyle="StaticResource NumericTableToolTipContentStyle"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Border.Resources>
<TextBlock x:Name="tbCellText" Text="Binding RelativeSource=RelativeSource TemplatedParent,
Path=Content.Text, Converter=StaticResource NumericTableCellContentConverter, ConverterCulture=x:Static gl:CultureInfo.CurrentCulture"
ToolTip="Binding ElementName=tbCellText, Path=Text"
TextWrapping="Wrap"/>
</Border>
</ControlTemplate>
有什么办法可以保留对象的类型吗?
我知道我可以与“NaN”进行比较,但我想要更通用的解决方案。
【问题讨论】:
顺便说一句,转换器将转换器文化作为参数之一 是的,我知道,但只要值是字符串类型,它就没有帮助...... @OriPrice 看到我的回答,你绑定到了错误的属性。 【参考方案1】:当您绑定到double
类型的属性时,转换器将获得double
类型的value
参数。您可以轻松做到这一点:
if (double.IsNaN((double)value))
return "-";
【讨论】:
谢谢,但我试过了,它不起作用。该值不能转换为双精度...... 我认为这是因为值对象正在以某种方式转换为字符串(“NaN”) 你绑定的属性不是double
类型的吗?如果它是一个在值为NaN
时始终为“NaN”的字符串,那么您的比较可以像if (value as string == "NaN")
一样简单。
我将它插入到一个数据表中(那里是一个双精度数据表),然后我用相关的转换器将数据表绑定到 xaml 中的数据网格。我希望到达转换器的值将保持不变(双),但显然它不会....我不想在字符串上中继...有没有办法将字符串“NAN”转换为双倍?
“相关转换器”是指我们在这里谈论的转换器?如果您绑定到的属性是 double
类型,那么转换器将获得 value
类型的 double
参数。如果不是这种情况,您必须找出原因。也许您发布了相关的 XAML(带有绑定)。【参考方案2】:
对弗拉德的一点补充:
if (value is double && double.IsNaN((double)value))
【讨论】:
谢谢,但我试过了,它不起作用。该值不能转换为双精度...... 值参数中有什么类型的值? 字符串。我不知道它来自哪里。 这意味着你绑定到一个字符串值。您为什么不考虑绑定到原始双精度值?尝试从绑定中删除“Path=Content.Text”部分。我想,DataGridCell 的 DataContext 应该是原始值。 其实我还是有问题。 DataGridCell 的数据上下文属于 DataRow 类型。不是特定的细胞。所以我在转换器中得到了整行。【参考方案3】:if (double.IsNaN(value)) ...
可以在任何语言环境中使用。
文档链接:http://msdn.microsoft.com/en-us/library/system.double.isnan.aspx
顺便说一句,直接与double.NaN
(if (value == double.NaN)
) 比较是行不通的,因为NaN
与NaN
的比较返回false
!但是,您可以通过这样的技巧检测NaN
:if (value != value) ...
(这仅适用于NaN
s)。但是显式测试double.IsNaN
更具可读性。
编辑:正如其他答案所暗示的,在转换器内部,您的value
可能不是double
,而是object
。所以你需要包括一张支票:
if (!(value is double))
return ""; // or signal an error, or whatever
double d = (double)value;
if (double.IsNaN(d))
return "-";
...
【讨论】:
谢谢,但我试过了,它不起作用。该值不能转换为双精度...... @Ori: 好吧,请你看看调试器,value
的实际类型是什么?
是的,它是一个字符串而不是双精度。更新了帖子(添加了相关的 Xaml)
@Ori:嗯。这个字符串是从哪里来的?哪些代码已将double.NaN
转换为本地化字符串?【参考方案4】:
不要绑定到 datagridcell 中的 content.text 属性。这就是为什么值以字符串形式出现的原因。
尝试将数据值存储在 TextBlock 的 Tag 属性中并绑定到该属性,然后在属性更新代码中设置文本的值。
【讨论】:
【参考方案5】:解决方案 - 问题是我将数据表绑定到数据网格,只有在那之后我才 转换所有值。从数据网格中提取值始终是类型字符串,所以这是我的问题。我只需要在直接绑定到数据表而不是数据网格单元时使用转换器。
【讨论】:
以上是关于在转换器 wpf 中将 double.NaN 转换为相关区域性的主要内容,如果未能解决你的问题,请参考以下文章
在 VS 2010 中将控制台应用程序转换为 WPF 应用程序时遇到问题
Scala Spark 在数据帧和数据集中以不同方式处理 Double.NaN
在 T-SQL 中将 '01-Sep-2017' 转换为 '01/09/2017'?