背景
我有一个自定义控件,包含一个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事件,但我不知道该如何做,或者这是否是一条道路。
知道怎么创造这样的东西吗?还是有更好的解决办法?
发布于 2013-10-27 14:02:56
答案是对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
事件吗?我不是百分之百肯定,但我认为这会发生在选择后作出。
https://stackoverflow.com/questions/19618648
复制相似问题