我有一个Datepicker,我想为用户提供多种格式。例如,对于日期January 5th 2014
,我想允许以下格式:
dd-MM-yyyy
d-MM-yyyy
d-M-yyyy
d-MM-yy
d-M-yy
dd-M-yyyy
dd-M-yy
dd-MM-yy
ddMMyyyy
ddMMyy
dMyyyy
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,这样我可以在用户放入整个日期时进行格式化,而不是按用户放入的每个字符执行此操作,但仍然没有更高效/更易读的解决方案比逐个检查所有格式?
答案 0 :(得分:1)
每个步骤抛出异常会花费很多性能。摆脱try{} catch{}
,for loop
并使用非常用户友好的TryParseExact
。它将接受您的'checks'
数组变量。
if(DateTime.TryParseExact(value as string, checks, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
// success
}