我们需要在运行时将未知结果集绑定到 WPF DataGrid。其中一些列将包含日期时间值,而我们需要正确格式化这些日期时间字段。在设计时不知道哪些列将是日期时间字段的情况下,我们如何能在运行时格式化这些列?
我们正在使用 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}" />
<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/yyyy格式,而不是我的德国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
参见:我的博客
Binding="{Binding Date, StringFormat=\{0:dd-MMM-yyyy\}}
- gideonBinding="{Binding date, StringFormat={}{0:dd/MM/yyyy}}"
- Xenan