DateSelectorButton.axaml.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Controls.Primitives;
  4. using Avalonia.Data.Converters;
  5. using CommunityToolkit.Mvvm.Input;
  6. using ExCSS;
  7. using InABox.Avalonia.Components.DateSelector;
  8. using InABox.Avalonia.Converters;
  9. using InABox.Core;
  10. using System.Globalization;
  11. using System.Windows.Input;
  12. namespace InABox.Avalonia.Components;
  13. public partial class DateSelectorButton : UserControl
  14. {
  15. public static readonly StyledProperty<string> PromptProperty =
  16. AvaloniaProperty.Register<DateSelectorButton, string>(nameof(Prompt));
  17. public static readonly StyledProperty<string> PrefixProperty =
  18. AvaloniaProperty.Register<DateSelectorButton, string>(nameof(Prefix));
  19. public static readonly StyledProperty<string> FormatProperty =
  20. AvaloniaProperty.Register<DateSelectorButton, string>(nameof(Format));
  21. public static readonly StyledProperty<DateTime?> DateProperty =
  22. AvaloniaProperty.Register<DateSelectorButton, DateTime?>(nameof(Date));
  23. public string Prompt
  24. {
  25. get => GetValue(PromptProperty);
  26. set => SetValue(PromptProperty, value);
  27. }
  28. public string Prefix
  29. {
  30. get => GetValue(PrefixProperty);
  31. set => SetValue(PrefixProperty, value);
  32. }
  33. public string Format
  34. {
  35. get => GetValue(FormatProperty);
  36. set => SetValue(FormatProperty, value);
  37. }
  38. public DateTime? Date
  39. {
  40. get => GetValue(DateProperty);
  41. set => SetValue(DateProperty, value);
  42. }
  43. public DateSelectorButton()
  44. {
  45. InitializeComponent();
  46. }
  47. [RelayCommand]
  48. private async Task Click()
  49. {
  50. var date = await Navigation.Popup<DateSelectorViewModel, DateTime?>(x =>
  51. {
  52. x.Date = Date;
  53. });
  54. if (date.HasValue)
  55. {
  56. Date = date.Value == DateTime.MinValue ? null : date.Value;
  57. }
  58. }
  59. }
  60. public class DateSelectorDateTimeFormatter : IMultiValueConverter
  61. {
  62. public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
  63. {
  64. var date = values[0] as DateTime?;
  65. if (values[1] is not DateSelectorButton btn) return null;
  66. if (date.HasValue && !date.Value.IsEmpty())
  67. {
  68. var sFormat = btn.Format.NotWhiteSpaceOr("dd MMMM yy");
  69. var fmt = "{0} {1:" + sFormat + "}";
  70. return string.Format(fmt, btn.Prefix, date.Value).Trim();
  71. }
  72. return btn.Prompt.NotWhiteSpaceOr("Select Date");
  73. }
  74. }