WPF:在ListBox上发布选择鼠标单击事件

时间:2013-10-27 13:35:41

标签: c# wpf listbox

在这里和我在一起,因为我会尝试解释我的情况。

背景

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

要求

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

  1. 用鼠标点击该项目。
  2. 他通过键盘导航(上/下键)选择了项目并点击输入
  3. 问题

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

    如果我在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事件,但我不确定如何,或者这是否还是要走的路。

    任何想法如何创造这样的东西?或者有更好的解决方案吗?

1 个答案:

答案 0 :(得分: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. 选择选项
  3. 使用Enter
  4. 选择项目

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