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 ListBoxUserSelectionBehavior : Behavior { public static readonly DependencyProperty UserSelectionCommandProperty = DependencyProperty.Register( nameof(UserSelectionCommand), typeof(ICommand), typeof(ListBoxUserSelectionBehavior)); public ICommand UserSelectionCommand { get => (ICommand)GetValue(UserSelectionCommandProperty); set => SetValue(UserSelectionCommandProperty, value); } public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register( nameof(CommandParameter), typeof(object), typeof(ListBoxUserSelectionBehavior)); public object CommandParameter { get => GetValue(CommandParameterProperty); set => SetValue(CommandParameterProperty, value); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.PreviewMouseDown += OnPreviewMouseDown; AssociatedObject.SelectionChanged += OnSelectionChanged; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.PreviewMouseDown -= OnPreviewMouseDown; AssociatedObject.SelectionChanged -= OnSelectionChanged; } private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) { AssociatedObject.Tag = true; // 标记为用户交互 } private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (AssociatedObject.Tag is bool isUserInteraction && isUserInteraction) { if (UserSelectionCommand?.CanExecute(CommandParameter) == true) { var parameter = new Tuple( CommandParameter, AssociatedObject.SelectedItem); UserSelectionCommand.Execute(parameter); } AssociatedObject.Tag = false; // 重置标记 } } } }