具有系统自定义短日期格式的WPF datagrid日期列
这与使用WPF数据网格的自定义日期格式线程略有不同具有系统自定义短日期格式的WPF datagrid日期列,wpf,datetime,wpfdatagrid,Wpf,Datetime,Wpfdatagrid,这与使用WPF数据网格的自定义日期格式线程略有不同 <TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" /> 我的Win7框有一个自定义的短日期字符串,在控制面板中定义为dd-MM-yy。我希望DataGrid中的日期列使用该设置进行显示。视图模型有一个名为“日期”的日期时间 <TextBlock Text="{Binding BirthDate, Converter={
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
我的Win7框有一个自定义的短日期字符串,在控制面板中定义为dd-MM-yy。我希望DataGrid中的日期列使用该设置进行显示。视图模型有一个名为“日期”的日期时间
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
我试过这个:
<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>
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
日期列显示为m/d/yyyy。DataGrid不使用系统短日期设置吗?不管它是自定义的还是非自定义的
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
WPF日期选择器的工作方式似乎有所不同。即使没有StringFormat(并且直接绑定到视图模型中的日期时间),也可以使用自定义短日期格式
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
我可以在DataGrid中通过在视图模型(Date->DateFormatted)中创建一个string属性来解决这个问题,getter使用DateTime.ToSortDateString,但我不确定这是最好的方法。而且我还没有弄清楚绑定的双向部分…:P
创建一个转换器,并在datetime列的绑定中使用它。继承IValueConverter的类。接收日期时间并返回字符串。
尝试将其设置/绑定为您的转换器。
:
[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);
}
}
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
然后按如下方式设置XAML:
<Window.Resources>
<wpfDataGridMisc:DateConverter x:Key="dateConverter"/>
</Window.Resources>
<DataGridTextColumn Binding="{Binding Date, Converter={StaticResource dateConverter}}"/>
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
我认为解决方案相当简单。您正在使用的
StringFormat
无效,因此它将被忽略,DataGridTextColumn
采用默认格式。如果改为将dd
指定为StringFormat
,它将按预期工作
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
因此,您的最终绑定将如下所示(包括双向):
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
但是,请注意,在编辑模式下,这会让人感到困惑,因为即使列只显示了一个数字(日期),但它实际上希望您在接受输入之前输入一个有效的日期,并根据您的要求重新格式化。您可以使用
DataGridTemplateColumn
来解决此问题,并在其中指定CellTemplate
和CellEditingTemplate
。这允许您配置日期-时间格式
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
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
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
C#代码
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
XAML代码
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />
当应用程序启动时,必须设置UICulture
。然后它将使用计算机中的正确格式。XAML资源始终默认为en US
您可以看到。谢谢!但是,我在OP中使用的短日期格式只是一个例子。我需要编写的ConvertBack需要是泛型的。可能是DateTime.TryParse.Note,您可能需要添加对空值的支持(取决于您的情况)。我完全不明白这是怎么回事!klut用完整的代码给出了同样的解决方案,但这甚至不是答案。很抱歉,我同意@Maverik。请随意更改答案。我只发布了如何用转换器解决它的逻辑。转换器易于阅读和学习。所以我省去了代码,节省了时间。我可能被录取了,因为我比其他人先回答。如果它改变了,对我来说没问题。但是我的答案没有错,所以我不认为我应该得到否决票。我可能不同意这个被选为答案(我从来没有说过这是错误的答案,但有一个更好的答案),但我不是那个否决你的人。我猜还有其他人同意我的观点。问题的所有者我可以自由地改变被接受的解决方案。对我来说没问题。最短、最清晰、最容易实现的解决方案!谢谢!:)
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateToString}}" />