这与使用WPF数据网格的自定义日期格式线程略有不同。
我的Win7框在控制面板中将自定义短日期字符串定义为dd-MM-yy。我想在DataGrid中使用日期列来使用该设置进行显示。视图模型具有名为“Date”的DateTime。
我试过了:
<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 DatePickers似乎工作方式不同。即使没有StringFormat(并且直接绑定到视图模型中的DateTime),也会使用自定义短日期格式。
我可以通过在视图模型中创建一个字符串属性(Date - &gt; DateFormatted)来解决DataGrid中的这个问题,其中getter使用DateTime.ToShortDateString,但我不确定这是执行此操作的最佳方法。我还没有找到绑定的TwoWay部分......:P
答案 0 :(得分:12)
尝试将此设置/绑定为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}}"/>
答案 1 :(得分:8)
我认为解决方案相当简单。您使用的StringFormat
无效,因此会被忽略,DataGridTextColumn
会转换为默认格式。如果您将dd
指定为StringFormat
,则可以按预期工作。
所以你的最终绑定看起来像这样(包括TwoWay):
<DataGridTextColumn Binding="{Binding Date, StringFormat=dd, Mode=TwoWay}" />
但请注意,这在编辑模式下会让人感到困惑,因为即使列只显示一个数字(当天),它实际上也希望您在接受输入并格式化之前在有效日期写入再次请求它。您可以使用DataGridTemplateColumn
并在其中指定CellTemplate
和CellEditingTemplate
来解决此问题。
答案 2 :(得分:0)
这允许您配置日期时间格式。
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}}" />
答案 3 :(得分:0)
您必须在应用程序启动时将UICulture
设置为它应该是什么。然后它将使用计算机中正确的格式。 XAML资源始终默认为您看到的en-US
。
答案 4 :(得分:-1)
创建转换器并在datetime列的绑定中使用它。继承IValueConverter的类。接收DateTime并返回一个String。