Reputation: 1963
i have in my application DatePicker. I would like write standart DateTime format (e.g. 2016-10-18), select DateTime from calendar or write custom format (e.g. ddmmrrrr, ddmm, ddmmrr...) I made DateTimeConverter:
class DateTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime emptyDateTime;
if (DateTime.TryParse(value.ToString(), out emptyDateTime) && emptyDateTime == DateTime.MinValue)
return DateTime.Now;
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int valueNumber;
string valueStr = value.ToString().Replace(".", "");
if (!int.TryParse(valueStr, NumberStyles.Integer, CultureInfo.InvariantCulture, out valueNumber))
return DateTime.Now;
if (valueStr.Length == 8) //format ddmmrrrr
{
DateTime emptyDateTime;
//for removing empty datetime (01.01.0001)
return DateTime.TryParse(value.ToString(), out emptyDateTime) && emptyDateTime == DateTime.MinValue
? (object) null
: new DateTime(valueNumber%10000, (valueNumber/10000)%100, valueNumber/1000000);
}
if (valueStr.Length == 6) //format ddmmrr
return new DateTime(2000 + valueNumber % 100, (valueNumber / 100) % 100, valueNumber / 10000);
if (valueStr.Length == 4) //format ddmm
return new DateTime(DateTime.Now.Year, valueNumber % 100, valueNumber / 100);
return DateTime.Now;
}
}
And this is my DatePicker:
<DatePicker Focusable="True" Grid.Column="4"
Text="{Binding Order.DateTime, Mode=TwoWay, Converter={StaticResource DateTimeConverter}}"
PreviewKeyDown="DatePicker_OnPreviewKeyDown"/>
This is property for binding:
class Order{
public DateTime DateTime { get; set; }
}
My problems are: When DatePicker is null, value in Order.DateTime is 01.01.0001 When I write my format (ddmmrrrr), value in Order.DateTime is DateTime.Now
I dont see whats wrong. Thanks
Upvotes: 1
Views: 288
Reputation: 1647
your Converter
checks the TryParse
wrong. Change it to:
if (!DateTime.TryParse(value.ToString(), out emptyDateTime) || emptyDateTime == DateTime.MinValue)
return DateTime.Now;
return value;
Upvotes: 1