WPF listboxitem PreviewKeyDown
我有一个绑定到自定义对象列表的列表框。我可以使用xaml中的listbox.ItemTemplate正确显示listbox项。listbox的自定义对象都属于下面概述的相同基类WPF listboxitem PreviewKeyDown,wpf,listbox,prism-4,Wpf,Listbox,Prism 4,我有一个绑定到自定义对象列表的列表框。我可以使用xaml中的listbox.ItemTemplate正确显示listbox项。listbox的自定义对象都属于下面概述的相同基类 public class HomeViewMenuItem : UIElement { private Uri _uri; private IRegionManager _manager; public HomeViewMenuItem(string text, Uri uri, IRegion
public class HomeViewMenuItem : UIElement
{
private Uri _uri;
private IRegionManager _manager;
public HomeViewMenuItem(string text, Uri uri, IRegionManager manager)
{
this.PreviewMouseDown += HomeViewMenuItem_PreviewMouseDown;
this.PreviewKeyDown += HomeViewMenuItem_PreviewKeyDown;
_manager = manager;
Text = text;
_uri = uri;
ClickCommand = new DelegateCommand(this.Click, this.CanClick);
}
void HomeViewMenuItem_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Enter)
{
e.Handled = true;
this.ClickCommand.Execute();
}
}
void HomeViewMenuItem_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = true;
this.ClickCommand.Execute();
}
private void Click()
{
_manager.Regions[RegionNames.MainRegion].RequestNavigate(_uri);
}
private bool CanClick()
{
return true;
}
public DelegateCommand ClickCommand { get; set; }
public string Text { get; set; }
}
我遇到的问题是没有调用HomeViewMenuItem_PreviewKeyDown方法。我相信这是因为该方法首先在ListBoxItem本身上被调用,然后在那里得到处理。我能够通过在ItemContainerGenerator状态更改为ContainerGenerated后通过listBox.ItemContainerGenerator.ContainerFromIndex0获取对ListBoxItem对象的引用并在其中添加事件处理程序来验证这一点。此事件处理程序已正确启动。通常,对于一个小项目来说,这是一个不错的解决方案,但我计划拥有更多具有相同功能的列表框,并且希望有一个更简单/更好的解决方案。有什么方法可以让我的基类previewkeydown方法工作吗
我能想到的唯一解决方案是让基类从ListBoxItem而不是UIElement继承,然后让ListBox创建我的项而不是ListBoxItems。但是如果不创建自己的ListBox实现,我认为这是不可能的。您似乎有些困惑。在WPF中,我们创建数据项并声明数据模板,以定义这些项在UI中的外观。我们的数据项不扩展UI类。如果必须处理PreviewKeyDown事件,请将处理程序附加到DataTemplate中的UI元素:
没有困惑,你的建议是我开始时已经有的。我想要一个更可重用的解决方案,因为我需要其他地方的按键功能。虽然我最终创建了listbox和listboxitem的自定义实现,以便我可以在其他地方重用它,但我会将您的答案标记为正确,因为它回答了我提出的问题。
<DataTemplate>
<Grid PreviewKeyDown="HomeViewMenuItem_PreviewKeyDown">
...
</Grid>
</DataTemplate>