31

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

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

4

8 回答 8

49

通过以下方式格式化绑定StringFormat

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

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

于 2009-08-21T21:04:31.917 回答
33

我想出了如何在代码中做到这一点......希望有一种方法可以在 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}";
        }
    }
}
于 2009-05-11T20:51:32.693 回答
23

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

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

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

于 2009-12-03T08:21:32.670 回答
8
<DataGridTextColumn Header="Last update"
    Width="110"
    IsReadOnly="True"
    Binding="{Binding Path=Contact.TimeUpdate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}, Mode=OneWay}" />
于 2011-09-01T08:14:20.173 回答
7

我将使用 DataType 为 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>
于 2009-05-11T16:59:57.283 回答
3

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

工作得很漂亮

于 2011-06-09T20:32:25.550 回答
2

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

<TextBlock  Text="{Binding Date_start,  StringFormat=\{0:dd-MM-yyyy\}, Mode=OneWay}" />
于 2015-02-26T22:23:45.123 回答
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

另见:我的博客

于 2009-09-02T12:59:48.137 回答