在转换器 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)) 比较是行不通的,因为NaNNaN 的比较返回false!但是,您可以通过这样的技巧检测NaNif (value != value) ...(这仅适用于NaNs)。但是显式测试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 转换为相关区域性的主要内容,如果未能解决你的问题,请参考以下文章

在WPF中将图片转换成3D图像并可以旋转

在 VS 2010 中将控制台应用程序转换为 WPF 应用程序时遇到问题

Scala Spark 在数据帧和数据集中以不同方式处理 Double.NaN

在 T-SQL 中将 '01-Sep-2017' 转换为 '01/09/2017'?

为啥 float.NaN != double.NaN 在 C# 中?

为啥 Double.NaN==Double.NaN 返回 false?