DatePickerUserSelectionBehavior.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Microsoft.Xaml.Behaviors;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using System.Windows.Input;
  10. namespace TeamAAS_VP.Behaviors
  11. {
  12. public class DatePickerUserSelectionBehavior : Behavior<DatePicker>
  13. {
  14. public static readonly DependencyProperty UserSelectionCommandProperty =
  15. DependencyProperty.Register(
  16. nameof(UserSelectionCommand),
  17. typeof(ICommand),
  18. typeof(DatePickerUserSelectionBehavior));
  19. public ICommand UserSelectionCommand
  20. {
  21. get => (ICommand)GetValue(UserSelectionCommandProperty);
  22. set => SetValue(UserSelectionCommandProperty, value);
  23. }
  24. public static readonly DependencyProperty CommandParameterProperty =
  25. DependencyProperty.Register(
  26. nameof(CommandParameter),
  27. typeof(object),
  28. typeof(DatePickerUserSelectionBehavior));
  29. public object CommandParameter
  30. {
  31. get => GetValue(CommandParameterProperty);
  32. set => SetValue(CommandParameterProperty, value);
  33. }
  34. private bool _isUserInteraction = false;
  35. private DateTime? _previousDate;
  36. protected override void OnAttached()
  37. {
  38. base.OnAttached();
  39. AssociatedObject.PreviewMouseDown += OnPreviewMouseDown;
  40. AssociatedObject.CalendarOpened += OnCalendarOpened;
  41. AssociatedObject.SelectedDateChanged += OnSelectedDateChanged;
  42. }
  43. protected override void OnDetaching()
  44. {
  45. base.OnDetaching();
  46. AssociatedObject.PreviewMouseDown -= OnPreviewMouseDown;
  47. AssociatedObject.CalendarOpened -= OnCalendarOpened;
  48. AssociatedObject.SelectedDateChanged -= OnSelectedDateChanged;
  49. }
  50. private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
  51. {
  52. _isUserInteraction = true;
  53. _previousDate = AssociatedObject.SelectedDate;
  54. }
  55. private void OnCalendarOpened(object sender, RoutedEventArgs e)
  56. {
  57. _isUserInteraction = true;
  58. _previousDate = AssociatedObject.SelectedDate;
  59. }
  60. private void OnSelectedDateChanged(object sender, SelectionChangedEventArgs e)
  61. {
  62. if (_isUserInteraction && UserSelectionCommand?.CanExecute(CommandParameter) == true)
  63. {
  64. var parameter = new Tuple<object, DateTime?, DateTime?>(
  65. CommandParameter,
  66. _previousDate,
  67. AssociatedObject.SelectedDate);
  68. UserSelectionCommand.Execute(parameter);
  69. }
  70. _isUserInteraction = false;
  71. }
  72. }
  73. }