我正在尝试处理来自 UserControl
的 RoutedEvent
,我通过使用 Interaction.Triggers
将它连接到命令来构建它。以下工作——它调用 AddingNewThingCommand
:
<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 是否适用于冒泡事件?
我的路由事件:
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
使用给定的 EventName
直接订阅 CLR 事件(使用反射:Type.GetEvent
)。
事件源对象将使用以下顺序确定:
- 如果
SourceObject
EventTrigger
的属性(property)已设置,请尝试获取该对象。如果它不为 null,则使用它。 - 如果
SourceName
的EventTrigger
已设置,使用命名对象解析器获取对象。 - 否则,使用关联对象
EventTrigger
直接连接到。
EventName
必须是一个简单的事件名称。不支持完全限定的事件名称(即 Type.EventName
)。这与 System.Windows.EventTrigger
形成对比,您可以在其中指定完全限定的路由事件名称 RoutedEvent
属性(property)。
简而言之,您无法简化您的 WrapPanel
以这种方式。
也许你可以使用 ItemsControl
用WrapPanel
作为ItemsPanel
并定义一个 DataTemplate
包含你的 MyCustomUserControl
与 EventTrigger
关于wpf - 如何在 WPF 中使用 Interaction.EventTrigger 和冒泡自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839553/