WPF DataGrid 如何显示 Double.Nan 的空白?

WPF DataGrid How to Display Blank for Double.Nan?

提问人:T. J. Fan 提问时间:10/19/2023 更新时间:10/19/2023 访问量:68

问:

我有大量数据由 DataTable 携带。大多数数据是双精度的;但是,其中许多是 NaN,如下所示:

enter image description here

我想将这些 NaN 值的显示更改为空白。我知道有某种类型的转换器可以实现这一点,但我真的不知道细节。我也知道我可以深入研究数据表中的每个单元格,并以编程方式将 NaN 转换为字符串空白;但是,我正在寻找更简单的方法。

WinForms 中的 DataGrid 有一个名为 CellFormatting 的事件,您可以在其中随意更改显示的文本。但是,我在 WPF 中找不到等效项。

任何帮助都是值得赞赏的。

请注意,DataTable 是动态的,因为列和行不是固定的。它们会根据获得的数据而变化。

C# WPF 数据网格 NAN 显示

评论

0赞 Sir Rufo 10/19/2023
这回答了你的问题吗?WPF DataGrid“CellFormatting 等效项”

答:

2赞 Pratham Nagpure 10/19/2023 #1

您可以为您的CellStyleDataGrid

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Content.Text,
                             Mode=OneWay, 
                             RelativeSource={RelativeSource Self}}" 
                             Value="NaN">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

警告:“NaN”的所有内容在视图中都将是空白的。

评论

0赞 T. J. Fan 10/20/2023
这个效果很好。非常感谢!
-1赞 mm8 10/19/2023 #2

您可以使用自定义转换器:

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double d = (double)value;
        if (double.IsNaN(d))
            return string.Empty;

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

XAML:

<DataGrid ...>
    <DataGrid.Resources>
        <local:DoubleConverter x:Key="converter" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        ...
        <DataGridTextColumn Header="Freight" Binding="{Binding Freight, Converter={StaticResource converter}}" />
        <DataGridTextColumn Header="Mean" Binding="{Binding Mean, Converter={StaticResource converter}}" />
        ...
    </DataGrid.Columns>
</DataGrid>

评论

0赞 T. J. Fan 10/20/2023
这种方法不起作用,因为我的数据表是动态的,因为列不是预定义的。它们是在运行时从数据源生成的。也就是说,列数和列标题(如“运费”、“平均值”)每次都会变化。
0赞 mm8 10/21/2023
那么如何创建列呢?显然,您可以通过编程方式以相同的方式设置属性。Converter
0赞 T. J. Fan 10/25/2023
我从数据表创建一个绑定源,然后将其分配给 DataGrid 的 ItemSource。网格的列是从数据表列自动生成的。
0赞 mm8 10/25/2023
然后,您可以处理该事件以创建与转换器的绑定。AutoGeneratedColumns