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

car*_*lot 2 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>
Run Code Online (Sandbox Code Playgroud)

日期列显示为m/d/yyyy.DataGrid是否使用系统短日期设置,无论是否自定义?

WPF DatePickers似乎工作方式不同.即使没有StringFormat(并且直接绑定到视图模型中的DateTime),也会使用自定义短日期格式.

我可以通过在视图模型(Date - > DateFormatted)中创建一个字符串属性来解决DataGrid中的这个问题,其中getter使用DateTime.ToShortDateString,但我不确定这是执行此操作的最佳方法.我还没有找到绑定的TwoWay部分......:P

Kcv*_*vin 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后像这样设置你的XAML:

<Window.Resources>
    <wpfDataGridMisc:DateConverter x:Key="dateConverter"/>
</Window.Resources>

<DataGridTextColumn Binding="{Binding Date, Converter={StaticResource dateConverter}}"/>
Run Code Online (Sandbox Code Playgroud)


Mav*_*rik 8

我认为解决方案相当简单.该StringFormat所以它被忽略,你使用的是无效的DataGridTextColumn度假胜地为默认格式.如果您改为指定ddStringFormat,则按预期工作.

所以你的最终绑定看起来像这样(包括TwoWay):

<DataGridTextColumn Binding="{Binding Date, StringFormat=dd, Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)

但是请注意,这在编辑模式下会让人感到困惑,因为即使列只显示一个数字(当天)它实际上希望您在接受该输入之前在有效日期写入并再次格式化它请求它.您可以通过使用一个解决此DataGridTemplateColumn代替,并指定CellTemplateCellEditingTemplate在那里.

  • 最短、最清晰、最容易实施的解决方案!谢谢你!:) (2认同)