DateTimePickerSelectedDateConverter.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Avalonia.Data.Converters;
  2. using System;
  3. using System.Globalization;
  4. namespace SukiUI.Controls
  5. {
  6. public class DateTimePickerSelectedDateConverter : IValueConverter
  7. {
  8. public static readonly DateTimePickerSelectedDateConverter Instance = new();
  9. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
  10. {
  11. if (value is not (DateTime or DateTimeOffset)) return null;
  12. try
  13. {
  14. switch (value)
  15. {
  16. // It is not allowed to add positive/negative LocalTimeOffset to a min/max Value of non-UTC DateTime
  17. case DateTime dateTime when dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue:
  18. return new DateTimeOffset(dateTime, TimeSpan.Zero);
  19. case DateTime dateTime:
  20. return new DateTimeOffset(dateTime);
  21. case DateTimeOffset dateTimeOffset:
  22. return dateTimeOffset;
  23. }
  24. }
  25. catch (ArgumentOutOfRangeException)
  26. {
  27. return null;
  28. }
  29. return null;
  30. }
  31. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
  32. {
  33. return value switch
  34. {
  35. null => null,
  36. DateTimeOffset dateTimeOffset when targetType == typeof(DateTimeOffset) => dateTimeOffset,
  37. DateTimeOffset dateTimeOffset when targetType == typeof(DateTimeOffset?) => dateTimeOffset,
  38. DateTimeOffset dateTimeOffset when targetType == typeof(DateTime) => dateTimeOffset.DateTime,
  39. DateTimeOffset dateTimeOffset when targetType == typeof(DateTime?) => dateTimeOffset.DateTime,
  40. DateTime dateTime when targetType == typeof(DateTimeOffset) => new DateTimeOffset(dateTime),
  41. DateTime dateTime when targetType == typeof(DateTimeOffset?) => new DateTimeOffset(dateTime),
  42. DateTime dateTime when targetType == typeof(DateTime) => dateTime,
  43. DateTime dateTime when targetType == typeof(DateTime?) => dateTime,
  44. _ => throw new NotSupportedException()
  45. };
  46. }
  47. }
  48. }