这与使用WPF数据网格的自定义日期格式线程略有不同。
我的Win7盒子有一个自定义的短日期字符串,在控制面板中定义为dd-MM-yy。我希望DataGrid中的日期列使用该设置进行显示。视图模型有一个DateTime叫做'Date'。
我试过了:
<DataGrid AutoGenerateColumns="False" Name="dataCondition" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" ></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Date, StringFormat=d}" />
<DataGridTextColumn Binding="{Binding Comment}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
日期列显示为m/d/yyyy。DataGrid是否使用系统短日期设置,而不管它是否自定义?
WPF日期pickers的工作方式似乎不同。即使没有StringFormat也可以使用自定义短日期格式(并且在视图模型中直接绑定到DateTime)。
我可以通过在视图模型(日期-> date格式化)中创建字符串属性来解决DataGrid中的这个问题,其中getter使用DateTime。ToShortDateString,但我不确定这是最好的方法。我还没弄清楚绑定的双向部分…: P
尝试将此设置/绑定为Converter
:
[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : IValueConverter
{
private const string _format = "dd-MM-yy";
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.ToString(_format);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DateTime.ParseExact((string) value, _format, culture);
}
}
然后像这样设置你的XAML:
<Window.Resources>
<wpfDataGridMisc:DateConverter x:Key="dateConverter"/>
</Window.Resources>
<DataGridTextColumn Binding="{Binding Date, Converter={StaticResource dateConverter}}"/>
我认为解决办法很简单。您使用的StringFormat
无效,因此它被忽略,DataGridTextColumn
采用默认格式。如果您将dd
指定为StringFormat
,它将按照您的期望工作。
<DataGridTextColumn Binding="{Binding Date, StringFormat=dd, Mode=TwoWay}" />
然而,请注意,这将在编辑模式下令人困惑,因为即使列只是显示一个数字(日期),它实际上也会期望您在接受输入并按照您的要求重新格式化之前写入有效日期。您可以通过使用DataGridTemplateColumn
来解决这个问题,并在其中指定CellTemplate
和CellEditingTemplate
。
这允许您配置日期时间格式。
VB代码Imports System.Windows.Data
Public Class DateTimeToString
Implements IValueConverter
Private _Format As String
Public Property Format() As String
Get
Return _Format
End Get
Set(ByVal value As String)
End Set
End Property
Public Function Convert(ByVal value As Object, _
ByVal targetType As System.Type, _
ByVal parameter As Object, _
ByVal culture As System.Globalization.CultureInfo) As Object _
Implements System.Windows.Data.IValueConverter.Convert
Dim DateTimeValue As DateTime
If DateTime.TryParse(value, DateTimeValue) Then
Return DateTimeValue.ToString(_Format)
End If
Return value
End Function
Public Function ConvertBack(ByVal value As Object, _
ByVal targetType As System.Type, _
ByVal parameter As Object, _
ByVal culture As System.Globalization.CultureInfo) As Object _
Implements System.Windows.Data.IValueConverter.ConvertBack
Dim StringValue As String = value.ToString
Dim DateTimeValue As DateTime
If DateTime.TryParse(StringValue, DateTimeValue) Then
Return DateTimeValue
End If
Return value
End Function
End Class
c#代码public class DateTimeToString : IValueConverter
{
public string Format { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime DateTimeValue = (DateTime)value;
return DateTimeValue.ToString(Format);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value.ToString();
DateTime DateTimeValue;
if (DateTime.TryParse(strValue, out DateTimeValue))
return DateTimeValue;
return value;
}
}
XAML代码
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
您必须在应用程序启动时设置UICulture
。然后,它将使用计算机中的正确格式。XAML资源总是默认为en-US
。
创建一个转换器,并在datetime列的绑定中使用它。继承了IValueConverter的类。接收一个DateTime并返回一个String