具有系统自定义短日期格式的WPF数据网格日期列



这与使用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,它将按照您的期望工作。

所以你最终的绑定看起来像这样(包括TwoWay):
<DataGridTextColumn Binding="{Binding Date, StringFormat=dd, Mode=TwoWay}" />

然而,请注意,这将在编辑模式下令人困惑,因为即使列只是显示一个数字(日期),它实际上也会期望您在接受输入并按照您的要求重新格式化之前写入有效日期。您可以通过使用DataGridTemplateColumn来解决这个问题,并在其中指定CellTemplateCellEditingTemplate

这允许您配置日期时间格式。

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

相关内容

  • 没有找到相关文章

最新更新