bluray
bluray

Reputation: 1963

WPF DatePicker - write custom datetime format

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

Answers (1)

WPFGermany
WPFGermany

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

Related Questions