将double.NaN转换为转换器wpf中的相关文化

时间:2012-07-19 13:51:36

标签: wpf converter cultureinfo culture nan

当我们没有值时,有一个数据表正在插入doubl.NaN。 我想要做的是每当我看到double.Nan我想改为“ - ”,因此我有一个带有以下代码的转换器:

        if (value.ToString() == double.NaN.ToString())
        {
            return "-";
        }

一切都在“en-us”文化上完美运作,但是当我们使用不同的文化时(比如“zn-cn”) 它不起作用,因为“double.NaN.ToString()”会产生一个中文单词,其中value.ToString()是正常的“NaN”。

我尝试使用转换器使用double.parse(),没有任何效果。

更新 - 确定问题是转换器将对象作为字符串获取而不是双倍这是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”进行比较,但我希望能找到更通用的解决方案。

4 个答案:

答案 0 :(得分:2)

当您绑定到double类型的属性时,转换器会获得类型为value的{​​{1}}参数。你可以很容易地做到这一点:

double

答案 1 :(得分:1)

if (double.IsNaN(value)) ...可以在任何语言环境中使用。

文档链接:http://msdn.microsoft.com/en-us/library/system.double.isnan.aspx

BTW,与double.NaNif (value == double.NaN))的直接比较无效,因为NaNNaN的比较会返回false!但是,您可以通过这样的技巧检测NaNif (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 "-";
...

答案 2 :(得分:1)

弗拉德的一点点补充:

if(value为double&amp;&amp; double.IsNaN((double)value))

答案 3 :(得分:0)

不要绑定到datagridcell中的content.text属性。这就是价值以字符串形式出现的原因。

尝试将数据值存储在TextBlock的Tag属性中并绑定到该属性,然后在属性更新代码中设置文本的值。