Datepicker并允许多种输入格式

时间:2014-11-18 13:01:46

标签: c# wpf datepicker converter date-formatting

我有一个Datepicker,我想为用户提供多种格式。例如,对于日期January 5th 2014,我想允许以下格式:

  • 05-01-2014:dd-MM-yyyy
  • 5-01-2014:d-MM-yyyy
  • 5-1-2014:d-M-yyyy
  • 5-01-14:d-MM-yy
  • 5-1-14:d-M-yy
  • 05-1-2014:dd-M-yyyy
  • 05-1-14:dd-M-yy
  • 05-01-14:dd-MM-yy
  • 05012014:ddMMyyyy
  • 050114:ddMMyy
  • 512014:dMyyyy
  • 5114:dMyy

我确实创建了以下测试转换器:

public class DatepickerConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;

        return ((DateTime)value).ToString("dd-MM-yyyy", CultureInfo.InvariantCulture);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (string.IsNullOrWhiteSpace(value as string)) return null;

        DateTime dt = DateTime.MinValue;
        string[] checks = {
                            "dd-MM-yyyy",
                            "d-MM-yyyy",
                            "d-MM-yy",
                            "d-M-yyyy",
                            "d-M-yy",
                            "dd-M-yyyy",
                            "dd-M-yy",
                            "d-M-yyyy",
                            "d-M-yy",
                            "ddMMyyyy",
                            "ddMMyy",
                            //"dMyyyy",
                            //"dMyy",
                        };
        for(int i = 0; i < checks.Length; i++)
        {
            try
            {
                dt = DateTime.ParseExact(value as string, checks[i], CultureInfo.InvariantCulture);
                if (dt != null) break;
            }
            catch (Exception){ }
        }

        return dt as DateTime?;
    }
}
然而,我有一个问题,一个问题。

问题是我从未将转换器分配给DatePicker。我用Google搜索并找到this stackoverflow answer,但它似乎没有在调试模式下转到转换器。 FIXED

我担心的是,每次用户输入内容时使用此for循环都会产生一些性能 - 适得其反。我知道我可以添加一个Property-Delay,这样我可以在用户放入整个日期时进行格式化,而不是按用户放入的每个字符执行此操作,但仍然没有更高效/更易读的解决方案比逐个检查所有格式?

1 个答案:

答案 0 :(得分:1)

每个步骤抛出异常会花费很多性能。摆脱try{} catch{}for loop并使用非常用户友好的TryParseExact。它将接受您的'checks'数组变量。

if(DateTime.TryParseExact(value as string, checks, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
    // success
}