我有一个ListBox,它使用DataTemplateSelector动态决定什么 要根据列表中项目的类型使用的模板。我现在想挂钩 可以由DataTemplate中的控件触发的事件。例如, 如果其中一个模板中有一个复选框,我希望应用程序使用 选中复选框时要通知的控件。如果有不同的模板 在其中的按钮,我想在单击按钮时收到通知。
此外,由于它是一个ListBox,许多项目可能具有相同的模板。所以 我需要一些RoutedEventArgs,所以我可以从OriginalSource走上去 一些处理事件的上下文信息。
我的解决方案是使用MouseLeftButtonUp。这适用于TextBlocks,但看起来CheckBox和Button控件集处理为true,因此事件不会冒泡。我该如何解决这些问题 事件所以我可以在我的调用应用程序中为它们分配处理程序?
(另外,Silverlight实际上并不支持DataTemplateSelector,所以我按照example来实现它)
答案 0 :(得分:0)
如果您在Xaml中为放置事件处理程序的用户控件定义模板,那么您应该只需在Xaml中分配事件处理程序。
但是,在您概述的特定方案中,您还可以通过MouseLeftButtonUp
方法收听AddHandler
事件: -
myListBox.AddHandler(UIElement.MouseLeftButtonUpEvent, myListBox_MouseLeftButtonUp, true);
...
private void myListBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
//e.OriginalSource available for your inspection
}
请注意,使用AddHandler
并在第三个参数中传递true
,无论是否已处理,都会获得该事件。