using Microsoft.Xaml.Behaviors; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace TeamAAS_VP.Behaviors { public class DatePickerUserSelectionBehavior : Behavior { public static readonly DependencyProperty UserSelectionCommandProperty = DependencyProperty.Register( nameof(UserSelectionCommand), typeof(ICommand), typeof(DatePickerUserSelectionBehavior)); public ICommand UserSelectionCommand { get => (ICommand)GetValue(UserSelectionCommandProperty); set => SetValue(UserSelectionCommandProperty, value); } public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register( nameof(CommandParameter), typeof(object), typeof(DatePickerUserSelectionBehavior)); public object CommandParameter { get => GetValue(CommandParameterProperty); set => SetValue(CommandParameterProperty, value); } private bool _isUserInteraction = false; private DateTime? _previousDate; protected override void OnAttached() { base.OnAttached(); AssociatedObject.PreviewMouseDown += OnPreviewMouseDown; AssociatedObject.CalendarOpened += OnCalendarOpened; AssociatedObject.SelectedDateChanged += OnSelectedDateChanged; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.PreviewMouseDown -= OnPreviewMouseDown; AssociatedObject.CalendarOpened -= OnCalendarOpened; AssociatedObject.SelectedDateChanged -= OnSelectedDateChanged; } private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) { _isUserInteraction = true; _previousDate = AssociatedObject.SelectedDate; } private void OnCalendarOpened(object sender, RoutedEventArgs e) { _isUserInteraction = true; _previousDate = AssociatedObject.SelectedDate; } private void OnSelectedDateChanged(object sender, SelectionChangedEventArgs e) { if (_isUserInteraction && UserSelectionCommand?.CanExecute(CommandParameter) == true) { var parameter = new Tuple( CommandParameter, _previousDate, AssociatedObject.SelectedDate); UserSelectionCommand.Execute(parameter); } _isUserInteraction = false; } } }