2

当我们没有值时,有一个使用 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

5 回答 5

2

当您绑定到 typedouble的属性时,转换器将获取 type 的value参数double。你可以很容易地做到这一点:

if (double.IsNaN((double)value))
{
    return "-";
}
于 2012-07-19T14:01:12.620 回答
1

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) ...这仅适用于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 "-";
...
于 2012-07-19T13:58:37.327 回答
1

对弗拉德的一点补充:

if (value is double && double.IsNaN((double)value))

于 2012-07-19T14:00:40.850 回答
0

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

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

于 2012-07-19T15:35:01.797 回答
0

解决方案 -问题是我将数据表绑定到数据网格,然后才转换所有值。从数据网格中提取值始终是类型字符串,所以这是我的问题。我只需要在直接绑定到数据表而不是数据网格单元时使用转换器。

于 2015-05-04T19:16:02.393 回答