ListBoxUserSelectionBehavior.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 ListBoxUserSelectionBehavior : Behavior<ListBox>
  13. {
  14. public static readonly DependencyProperty UserSelectionCommandProperty =
  15. DependencyProperty.Register(
  16. nameof(UserSelectionCommand),
  17. typeof(ICommand),
  18. typeof(ListBoxUserSelectionBehavior));
  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(ListBoxUserSelectionBehavior));
  29. public object CommandParameter
  30. {
  31. get => GetValue(CommandParameterProperty);
  32. set => SetValue(CommandParameterProperty, value);
  33. }
  34. protected override void OnAttached()
  35. {
  36. base.OnAttached();
  37. AssociatedObject.PreviewMouseDown += OnPreviewMouseDown;
  38. AssociatedObject.SelectionChanged += OnSelectionChanged;
  39. }
  40. protected override void OnDetaching()
  41. {
  42. base.OnDetaching();
  43. AssociatedObject.PreviewMouseDown -= OnPreviewMouseDown;
  44. AssociatedObject.SelectionChanged -= OnSelectionChanged;
  45. }
  46. private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
  47. {
  48. AssociatedObject.Tag = true; // 标记为用户交互
  49. }
  50. private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
  51. {
  52. if (AssociatedObject.Tag is bool isUserInteraction && isUserInteraction)
  53. {
  54. if (UserSelectionCommand?.CanExecute(CommandParameter) == true)
  55. {
  56. var parameter = new Tuple<object, object>(
  57. CommandParameter,
  58. AssociatedObject.SelectedItem);
  59. UserSelectionCommand.Execute(parameter);
  60. }
  61. AssociatedObject.Tag = false; // 重置标记
  62. }
  63. }
  64. }
  65. }