【问题标题】:Post selection mouse click event on ListBox在 ListBox 上发布选择鼠标单击事件
【发布时间】:2013-10-27 13:35:40
【问题描述】:

背景

我有自定义控件,包含一个Popup,其中包含一个ListBox

要求

当用户选择一个项目时,我需要关闭弹出窗口并对所选项目执行一些逻辑。用户在以下情况下选择项目:

  1. 他用鼠标点击项目。
  2. 他通过键盘导航(上/下键)选择和项目,然后点击进入

问题

我已经实现了上述所有内容,但我的问题是要监听的事件以执行我的逻辑。

如果我在 SelectionChanged 事件上执行我的逻辑,当用户单击所选项目时它不会触发,所以我错过了我的第一个场景。 如果我在PreviewMouseLeftButtonDown 上执行我的逻辑,它将在选择更改之前触发,所以我不知道用户选择了什么。这也是我不能同时使用两者的原因。

我想过监听 ListBoxItem 事件来执行此操作 (How to capture a mouse click on an Item in a ListBox in WPF?) 或以隐式 ListBoxItem 样式 (WPF Interaction triggers in a Style to invoke commands on View Model) 发出命令,但它们对我不起作用。

我想出的最佳想法是通过行为或动作创建某种“后选择”MouseButtonDown 事件,但我不确定如何,或者这是否是可行的方法。

任何想法如何创建这样的东西?还是有更好的解决方案?

【问题讨论】:

  • 您发布的第一个链接适合您的需要。您能通过在 listboxItem 上设置事件来判断为什么不起作用吗?

标签: c# wpf listbox


【解决方案1】:

答案是BindListBox.SelectedItem 属性并处理您的控件的PreviewKeyDown 事件。这样,您将始终知道哪个项目是选定的项目以及何时按下Enter 键:

public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.
    Register("SelectedItem", typeof(YourDataType), typeof(YourControl), 
    new UIPropertyMetadata(null, OnSelectedItemPropertyChanged));

public YourDataType SelectedItem 
{
    get { return (YourDataType)GetValue(SelectedItemProperty); }
    set { SetValue(SelectedItemProperty, value); }
}

private static void OnSelectedItemPropertyChanged(DependencyObject sender, 
    DependencyPropertyChangedEventArgs e)
{
    // User has selected an item
}
...
private void Control_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter || e.Key == Key.Return)
    {
        // User pressed Enter... do something with SelectedItem property here
    }
}

更新>>>

好的,我想我现在更了解您的问题了。最简单的解决方案是,如果您可以稍微改变要求,以便;

  1. 使用鼠标或键盘的向上/向下键选择了一个项目
  2. 使用Enter选择了一个项目

这样,当用户选择时,您始终知道所选项目。但是,如果您不能这样做,您可以处理PreviewMouseLeftButtonUp 而不是PreviewMouseLeftButtonDown 事件吗?我不能 100% 确定,但我认为这会发生在选择之后。

【讨论】:

  • 谢谢,但我使用绑定到我的列表框的IColletionView,并访问它的CurrentItem 属性。我应该将另一个属性绑定到 ListBoxSelectedItem 吗?另外它是如何解决用户点击已经选择的项目的问题的?
  • 在发布这个问题之前,我已经尝试过鼠标悬停在 approch 上的“自动选择”,它确实有效,但如果我不这样做,我只会将其用作解决方法找到答案。至于你PreviewMouseLeftButtonUp 的第二个解决方案我还没有测试过(我不知道为什么现在看起来这么明显)。明天我会测试它并相应地更新。谢谢:)
  • 原来KeyUp 确实在选择后发生,但由于某种原因,它不会 100% 触发。我认为这是我ControlTemplate 中几个元素之间的焦点问题,但我还没有完全弄清楚。现在我继续使用“鼠标悬停时自动选择”方法,所以我将接受这个答案。谢谢。
  • 试试PreviewKeyUp 事件。 KeyUp 事件可能由相关控件之一处理,而您应该始终能够获得PreviewKeyUp 事件。
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多