需要在动态构建的WPF DataGrid中格式化日期

时间:2009-05-11 15:38:51

标签: wpf datetime datagrid format

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

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

8 个答案:

答案 0 :(得分:47)

怎么样

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

我认为这比编写更大的代码片段更好

答案 1 :(得分:31)

我想出了如何在代码中执行此操作...希望有一种方法可以在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}";
        }
    }
}

答案 2 :(得分:18)

嘿,您可以在WPF表单的构造函数中将区域设置文化信息设置为

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

您可以在窗口标题标记中包含xml标记 xml:lang =“en-GB”

答案 3 :(得分:8)

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

答案 4 :(得分:7)

我会使用DataTemplate,其DataType为Date或DateTime(取决于它将通过哪个)。使用绑定中的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>

答案 5 :(得分:3)

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

美妙地工作

答案 6 :(得分:2)

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

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

答案 7 :(得分:0)

FarrEver的回答,5月11日是好的,但是我不能发挥作用。我仍然得到美国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