ComboBoxSelectionBehavior.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Microsoft.Xaml.Behaviors;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Input;
  12. namespace TeamAAS_VP.Behaviors
  13. {
  14. public class ComboBoxSelectionBehavior : Behavior<ComboBox>
  15. {
  16. // 定义一个依赖属性,用于绑定命令
  17. public static readonly DependencyProperty UserSelectionCommandProperty =
  18. DependencyProperty.Register(
  19. nameof(UserSelectionCommand),
  20. typeof(ICommand),
  21. typeof(ComboBoxSelectionBehavior));
  22. public ICommand UserSelectionCommand
  23. {
  24. get => (ICommand)GetValue(UserSelectionCommandProperty);
  25. set => SetValue(UserSelectionCommandProperty, value);
  26. }
  27. // 定义 CommandParameter 依赖属性
  28. public static readonly DependencyProperty CommandParameterProperty =
  29. DependencyProperty.Register(
  30. nameof(CommandParameter),
  31. typeof(object),
  32. typeof(ComboBoxSelectionBehavior));
  33. public object CommandParameter
  34. {
  35. get => GetValue(CommandParameterProperty);
  36. set => SetValue(CommandParameterProperty, value);
  37. }
  38. protected override void OnAttached()
  39. {
  40. base.OnAttached();
  41. AssociatedObject.SelectionChanged += OnSelectionChanged;
  42. AssociatedObject.PreviewMouseDown += OnPreviewMouseDown;
  43. AssociatedObject.PreviewMouseWheel += OnPreviewMouseWheel;// 处理鼠标滚轮事件
  44. }
  45. protected override void OnDetaching()
  46. {
  47. base.OnDetaching();
  48. AssociatedObject.SelectionChanged -= OnSelectionChanged;
  49. AssociatedObject.PreviewMouseDown -= OnPreviewMouseDown;
  50. AssociatedObject.PreviewMouseWheel -= OnPreviewMouseWheel; // 处理鼠标滚轮事件
  51. }
  52. private void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
  53. {
  54. if (sender is ComboBox comboBox)
  55. {
  56. if (!comboBox.IsDropDownOpen)
  57. {
  58. // 吞掉滚轮事件,禁止它改变选项
  59. e.Handled = true;
  60. }
  61. }
  62. }
  63. private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
  64. {
  65. }
  66. private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
  67. {
  68. if (sender is ComboBox comboBox && comboBox.IsDropDownOpen)
  69. {
  70. if (UserSelectionCommand?.CanExecute(CommandParameter) == true)
  71. {
  72. // 用户手动选择
  73. var selectedItem = AssociatedObject.SelectedItem;
  74. var parameter = new Tuple<object, object>(CommandParameter, comboBox.SelectedItem);
  75. UserSelectionCommand.Execute(parameter);
  76. }
  77. }
  78. }
  79. }
  80. }