如何在WPF中使用Interaction.EventTrigger和冒泡自定义事件
问题描述:
我试图通过使用Interaction.Triggers
将它挂接到一个命令来构建UserControl
来尝试处理RoutedEvent
。下面的作品 - 它会调用AddingNewThingCommand
:如何在WPF中使用Interaction.EventTrigger和冒泡自定义事件
<WrapPanel>
<local:MyCustomUserControl Header="MyHeader1"
ItemsSource="{Binding List1}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="AddingNewThing">
<prism:InvokeCommandAction Command="{Binding DataContext.AddingNewThingCommand, ElementName=rootViewElement}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</local:MyCustomUserControl >
<local:MyCustomUserControl Header="MyHeader2"
ItemsSource="{Binding List2}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="AddingNewThing">
<prism:InvokeCommandAction Command="{Binding DataContext.AddingNewThingCommand, ElementName=rootViewElement}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</local:MyCustomUserControl >
</WrapPanel>
现在,我其实有很多在这裹面板这些用户控件实例,所以我宁愿移动交互触发父元素 - WrapPanel 。以下不起作用:
<WrapPanel>
<i:Interaction.Triggers>
<!-- Also tried local:MyCustomUserControl.AddingNewThing -->
<i:EventTrigger EventName="MyCustomUserControl.AddingNewThing">
<prism:InvokeCommandAction Command="{Binding DataContext.AddingNewThingCommand, ElementName=rootViewElement}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<local:MyCustomUserControl Header="MyHeader1"
ItemsSource="{Binding List1}"/>
<local:MyCustomUserControl Header="MyHeader2"
ItemsSource="{Binding List2}"/>
</WrapPanel>
EventTrigger是否适用于冒泡事件?
我RoutedEvent:
public static readonly RoutedEvent AddingNewThingEvent = EventManager.RegisterRoutedEvent(
"AddingNewThing", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyCustomUserControl));
public event RoutedEventHandler AddingNewThing
{
add { AddHandler(AddingNewThingEvent, value); }
remove { RemoveHandler(AddingNewThingEvent, value); }
}
答
通常情况下,路由事件系统允许任何路由事件处理程序连接到任何UIElement
或ContentElement
。这就是路由事件的工作原理。
然而,System.Windows.Interactivity.EventTrigger
不是视觉树的一部分,因此不能参加本次路由事件调度。 EventTrigger
直接订阅CLR事件EventName
(使用反射:Type.GetEvent
)。
- 如果
EventTrigger
的SourceObject
属性设置,试图获取对象:事件源对象将使用下列顺序确定。如果它不为空,则使用它。
- 如果
EventTrigger
的SourceName
设置,使用命名对象解析器获取对象。 - 否则,使用
EventTrigger
被直接附接至相关联的对象。
EventName
必须是一个简单的事件名称。不支持全限定事件名称(即Type.EventName
)。这与System.Windows.EventTrigger
相反,您可以在RoutedEvent
属性中指定标准路由事件名称。
因此,在短期,你不能简化这样你WrapPanel
。 也许你可以使用ItemsControl
和WrapPanel
作为ItemsPanel
,并且定义一个DataTemplate
,其中包含MyCustomUserControl
和EventTrigger
。
优秀的解释,谢谢! – bzuillsmith