我有一个绑定到自定义对象列表的列表框。我可以使用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实现,我认为这是不可能的。
答案 0 :(得分:0)
DataTemplate
以定义这些项在UI中的外观。我们的数据项不扩展UI类。如果有来处理PreviewKeyDown
事件,请将处理程序附加到DataTemplate
中的 UI元素:
<DataTemplate>
<Grid PreviewKeyDown="HomeViewMenuItem_PreviewKeyDown">
...
</Grid>
</DataTemplate>