WPF listboxitem PreviewKeyDown

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

我有一个绑定到自定义对象列表的列表框。我可以使用xaml中的listbox.ItemTemplate正确显示listbox项。listbox的自定义对象都属于下面概述的相同基类

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>