0

背景

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

要求

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

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

问题

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

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

我想过监听ListBoxItem事件来执行此操作(如何在 WPF 中的 ListBox 中捕获鼠标单击项目?)或从隐式ListBoxItem样式触发命令(样式中的 WPF 交互触发以调用视图模型上的命令)但是他们没有为我工作。

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

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

4

1 回答 1

1

答案是Bind属性ListBox.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% 确定,但我认为在做出选择之后会发生这种情况。

于 2013-10-27T14:02:56.803 回答