具有系统自定义短日期格式的WPF datagrid日期列

具有系统自定义短日期格式的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={

这与使用WPF数据网格的自定义日期格式线程略有不同

<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}}" />