在这里和我在一起,因为我会尝试解释我的情况。
我有自定义控件,其中包含Popup
,其中包含ListBox
当用户选择项目时,我需要关闭弹出窗口并对所选项目做一些逻辑。用户在以下时间选择项目:
我已经实现了上述所有功能,但我的问题是要监听事件以执行我的逻辑。
如果我在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事件,但我不确定如何,或者这是否还是要走的路。
任何想法如何创造这样的东西?或者有更好的解决方案吗?
答案 0 :(得分: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
}
}
更新>>>
好的,我想我现在明白了你的问题。最简单的解决方案是,如果您可以略微改变要求,那么;
Enter
键这样,当用户选择时,您总是知道所选项目。但是,如果您不能这样做,您可以处理PreviewMouseLeftButtonUp
而不是PreviewMouseLeftButtonDown
事件吗?我不是百分百肯定,但我认为在选择之后会发生。