【问题标题】:Need to format dates in dynamically built WPF DataGrid需要在动态构建的 WPF DataGrid 中格式化日期
【发布时间】:2010-10-25 07:46:28
【问题描述】:

我们在运行时将未知结果集绑定到 WPF DataGrid。我们的一些列将包含 DateTime 值,我们需要正确格式化这些日期时间字段。在设计时不知道哪些列将成为 DateTime 字段,我们如何能够在运行时格式化这些列?

我们使用 DataTable 的 DefaultView 绑定到 WPF DataGrid。

【问题讨论】:

    标签: wpf datetime datagrid format


    【解决方案1】:

    我会使用数据类型为 Date 或 DateTime 的 DataTemplate(取决于它将通过的方式)。在绑定中使用 StringFormat 将 TextBlock 放置在 DataTemplate 中。

    这样的东西应该可以工作(未经测试)

    <DataTemplate DataType="{x:Type DateTime}">
        <TextBlock Text="{Binding StringFormat={0:d}}"  />
    </DataTemplate>
    

    或者如果您希望它仅在网格中应用

    <wpfToolkit:DataGrid>
        <wpfToolkit:DataGrid.Resources>
            <DataTemplate DataType="{x:Type DateTime}">
                <TextBlock Text="{Binding StringFormat={0:d}}"  />
            </DataTemplate>
        </wpfToolkit:DataGrid.Resources>
        ...
    </wpfToolkit:DataGrid>
    

    【讨论】:

    • 是否可以将此模板仅应用于 Grid 中的 DateTime 值而不是窗口/应用程序?
    • 是的,把它扔进
    • Bryan - 我有代码,但网格仍在使用原始格式。我什至创建了一个值转换器来将任何 DateTime 值格式化为指定的格式。我在格式化程序中放置了一个断点,它从未命中代码。似乎 DateTime 类型没有被用作网格中的模板。对此有什么想法吗?也许我们需要一个 DataGridColumn 转换器之类的。
    • 在网格上设置 ItemSource 后,有没有办法在代码中执行此操作?
    • 您使用的是哪种 DataGridColumn?尝试使用自定义列并使用 ContentPresenter 作为它的模板。如果有,这将使用提供的 DataTemplate,否则它将使用 TextBlock,其 Text 属性绑定到对象的 ToString 方法。
    【解决方案2】:

    我想出了如何在代码中做到这一点......希望有一种方法可以在 XAML 中模仿这一点。 (如果您找到有效的 XAML 示例,请发布。)

    要在代码中完成此操作,请为 Grid 的 AutoGeneratingColumn 事件添加一个事件处理程序,例如:

    private void ResultsDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyType == typeof(DateTime))
        {
            DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
            if (dataGridTextColumn != null)
            {
                dataGridTextColumn.Binding.StringFormat = "{0:d}";
            }
        }
    }
    

    【讨论】:

    • 或者,如果您需要其他日期格式:dataGridTextColumn.Binding.StringFormat = "{0:dd.MM.yyyy}";
    • ((DataGridTextColumn)e.Column).Binding.StringFormat = "{0:d}";
    • 这就是答案。其余的不处理动态生成。 (自动生成列)
    • 一般情况下,当我还设置 AutoGenerateColumns="False" 时,我无法触发此事件。但考虑到事件的名称,这并不令人惊讶。
    【解决方案3】:

    StringFormat格式化绑定:

    <DataGridTextColumn Header="Fecha Entrada" 
                        Width="110"  
                        Binding="{Binding EnterDate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}}"
                        IsReadOnly="True" />
    

    我认为这比在代码后面写代码要好

    【讨论】:

    • grr.. :( 给我标记错误.. 只能这样工作:Binding="{Binding Date, StringFormat=\{0:dd-MMM-yyyy\}}
    • 这有效,但只有在删除 \'s 之后:Binding="{Binding date, StringFormat={}{0:dd/MM/yyyy}}"
    • 如答案所述为我工作。
    • 我不明白为什么它是最喜欢的答案,情况是列是动态的,而您所做的事情是硬编码的。我错过了什么吗?!
    • 这不是意味着您需要在设计时了解列吗? ...与要求相反。
    【解决方案4】:

    5 月 11 日 FarrEver 的答案很好,但对我来说它不起作用。我仍然得到美国的 mm/dd/yyy 而不是我的德国 dd/mm/yyyy。所以我建议找电脑的区域设置,在StringFormat中使用

        Private Sub DGrid_AutoGeneratingColumn(ByVal sender As System.Object, ByVal e As Microsoft.Windows.Controls.DataGridAutoGeneratingColumnEventArgs)
        If e.PropertyType Is GetType(DateTime) Then
            Dim dataGridTextColumn As DataGridTextColumn = TryCast(e.Column, DataGridTextColumn)
            If dataGridTextColumn IsNot Nothing Then
                Dim ShortDatePattern As String = System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern
                dataGridTextColumn.Binding.StringFormat = "{0:" + ShortDatePattern + "}" '"{0:dd/MM/yyyy}"
            End If
        End If
    End Sub
    

    另请参阅:my blog

    【讨论】:

      【解决方案5】:

      您可以在 WPF 表单的构造函数中将语言环境文化信息设置为

      this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);

      或者您可以在窗口标题标记中包含 xml 标记 xml:lang="en-GB"

      【讨论】:

      • xml:lang 解决方案很棒。
      • 哇...我需要找到记录在哪里,也许还有更多这样的宝石可以找到
      • 有史以来最好的答案之一。永远!
      【解决方案6】:

      dataGridTextColumn.Binding.StringFormat = "{0:dd/MM/yyyy}";

      干得漂亮

      【讨论】:

        【解决方案7】:
        <DataGridTextColumn Header="Last update"
            Width="110"
            IsReadOnly="True"
            Binding="{Binding Path=Contact.TimeUpdate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}, Mode=OneWay}" />
        

        【讨论】:

          【解决方案8】:

          我是这样跑的。它的工作完成了。

          <TextBlock  Text="{Binding Date_start,  StringFormat=\{0:dd-MM-yyyy\}, Mode=OneWay}" />
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-06-22
            • 2015-11-03
            • 2011-11-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多