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

时间:2013-01-11 17:03:45

标签: wpf datetime wpfdatagrid

这与使用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

5 个答案:

答案 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并在其中指定CellTemplateCellEditingTemplate来解决此问题。

答案 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。