我们在运行时将未知结果集绑定到 WPF DataGrid。我们的一些列将包含 DateTime 值,我们需要正确格式化这些日期时间字段。在不知道设计时哪些列将成为 DateTime 字段的情况下,我们如何能够在运行时格式化这些列?
我们使用 DataTable 的 DefaultView 绑定到 WPF DataGrid。
通过以下方式格式化绑定StringFormat
:
<DataGridTextColumn Header="Fecha Entrada"
Width="110"
Binding="{Binding EnterDate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}}"
IsReadOnly="True" />
我认为这比在代码后面写代码要好
我想出了如何在代码中做到这一点......希望有一种方法可以在 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}";
}
}
}
嘿,您可以在 WPF 表单的构造函数中将语言环境文化信息设置为
this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
或者您可以在窗口标题标记中包含 xml 标记xml:lang="en-GB"
<DataGridTextColumn Header="Last update"
Width="110"
IsReadOnly="True"
Binding="{Binding Path=Contact.TimeUpdate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}, Mode=OneWay}" />
我将使用 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>
dataGridTextColumn.Binding.StringFormat = "{0:dd/MM/yyyy}";
工作得很漂亮
我这样跑。它的工作完成了。
<TextBlock Text="{Binding Date_start, StringFormat=\{0:dd-MM-yyyy\}, Mode=OneWay}" />
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
另见:我的博客