背景
我有一个自定义控件,包含一个 Popup ,其中包含一个 ListBox
Popup
ListBox
要求
当用户选择一个项目时,我需要关闭弹出窗口并对所选的项执行一些逻辑操作。在下列情况下,用户选择一项:
问题
我已经实现了上述所有内容,但我的问题是,为了执行我的逻辑,需要倾听的事件。
如果我对 SelectionChanged 事件执行我的逻辑,当用户单击所选的项时,它将不会触发,因此我错过了我的第一个场景。如果我在 PreviewMouseLeftButtonDown 上执行我的逻辑,它会在选择改变之前触发,所以我不知道用户选择了什么。这也是为什么我不能同时使用。
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 )中触发一个命令,但它们对我不起作用。
ListBoxItem
我想出的最好的想法是通过行为或行动创建某种“事后选择”的MouseButtonDown事件,但我不知道该如何做,或者这是否是一条道路。
知道怎么创造这样的东西吗?还是有更好的解决办法?
上云精选
2核2G云服务器 每月9.33元起,还有更多云产品低至0.02元
答案是对 Bind 属性进行 ListBox.SelectedItem 处理,并处理控件的 PreviewKeyDown 事件。这样,您将始终知道哪个项是选定的项,以及何时按下 Enter 键:
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)