using Microsoft.Xaml.Behaviors; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; 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 ComboBoxSelectionBehavior : Behavior { // 定义一个依赖属性,用于绑定命令 public static readonly DependencyProperty UserSelectionCommandProperty = DependencyProperty.Register( nameof(UserSelectionCommand), typeof(ICommand), typeof(ComboBoxSelectionBehavior)); public ICommand UserSelectionCommand { get => (ICommand)GetValue(UserSelectionCommandProperty); set => SetValue(UserSelectionCommandProperty, value); } // 定义 CommandParameter 依赖属性 public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register( nameof(CommandParameter), typeof(object), typeof(ComboBoxSelectionBehavior)); public object CommandParameter { get => GetValue(CommandParameterProperty); set => SetValue(CommandParameterProperty, value); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.SelectionChanged += OnSelectionChanged; AssociatedObject.PreviewMouseDown += OnPreviewMouseDown; AssociatedObject.PreviewMouseWheel += OnPreviewMouseWheel;// 处理鼠标滚轮事件 } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.SelectionChanged -= OnSelectionChanged; AssociatedObject.PreviewMouseDown -= OnPreviewMouseDown; AssociatedObject.PreviewMouseWheel -= OnPreviewMouseWheel; // 处理鼠标滚轮事件 } private void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e) { if (sender is ComboBox comboBox) { if (!comboBox.IsDropDownOpen) { // 吞掉滚轮事件,禁止它改变选项 e.Handled = true; } } } private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) { } private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (sender is ComboBox comboBox && comboBox.IsDropDownOpen) { if (UserSelectionCommand?.CanExecute(CommandParameter) == true) { // 用户手动选择 var selectedItem = AssociatedObject.SelectedItem; var parameter = new Tuple(CommandParameter, comboBox.SelectedItem); UserSelectionCommand.Execute(parameter); } } } } }