2

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

我的 Win7 盒子有一个自定义短日期字符串,在控制面板中定义为 dd-MM-yy。我希望 DataGrid 中的日期列使用该设置进行显示。视图模型有一个称为“日期”的日期时间。

我试过这个:

   <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),也会使用自定义短日期格式。

我可以通过在 getter 使用 DateTime.ToShortDateString 的视图模型(Date -> DateFormatted)中创建一个字符串属性来解决 DataGrid 中的这个问题,但我不确定这是最好的方法。而且我还没有制定出绑定的 TwoWay 部分......:P

4

5 回答 5

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}}"/>
于 2013-01-11T17:58:54.170 回答
9

我认为解决方案相当简单。StringFormat您使用的是无效的,因此它会被忽略并采用DataGridTextColumn默认格式。如果您改为指定ddas StringFormat,它将按预期工作。

因此您的最终绑定将如下所示(包括 TwoWay):

<DataGridTextColumn Binding="{Binding Date, StringFormat=dd, Mode=TwoWay}" />

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

于 2013-01-12T08:09:26.473 回答
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}}" />
于 2014-10-01T04:10:43.123 回答
0

您必须将UICulture应用程序启动的时间设置为应有的状态。然后它将使用计算机中的正确格式。XAML 资源始终默认为en-US您所见。

于 2016-06-21T15:02:23.117 回答
-1

创建一个转换器并在 datetime 列的绑定中使用它。继承 IValueConverter 的类。接收一个日期时间并返回一个字符串。

于 2013-01-11T17:20:50.937 回答