WPF listboxitem PreviewKeyDown

时间:2014-03-06 18:26:53

标签: wpf listbox prism-4

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

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状态更改为ContainersGenerated并在其中添加事件处理程序之后,通过listBox.ItemContainerGenerator.ContainerFromIndex(0)获取对ListBoxItem对象的引用,我能够验证这一点。正确触发此事件处理程序。通常这对于一个小项目来说是一个很好的解决方案,但我计划拥有更多具有相同功能的列表框,并希望有一个更简单/更好的解决方案。有没有办法让我的基类previewkeydown方法工作?

我能想到的唯一解决方案是让基类继承自ListBoxItem而不是UIElement,然后获取ListBox来创建我的项而不是ListBoxItems。但是,如果不创建自己的ListBox实现,我认为这是不可能的。

1 个答案:

答案 0 :(得分:0)

你似乎有些困惑。在WPF中,我们创建数据项并声明DataTemplate以定义这些项在UI中的外观。我们的数据项扩展UI类。如果来处理PreviewKeyDown事件,请将处理程序附加到DataTemplate中的 UI元素

<DataTemplate>
    <Grid PreviewKeyDown="HomeViewMenuItem_PreviewKeyDown">
        ...
    </Grid>
</DataTemplate>