我正在尝试通过使用RoutedEvent
将其连接到命令来构建UserControl
我构建的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是否适用于冒泡事件?
我的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); }
}
答案 0 :(得分:3)
通常,路由事件系统允许任何路由事件的处理程序附加到任何UIElement
或ContentElement
。这就是路由事件的工作原理。
但是,System.Windows.Interactivity.EventTrigger
不是可视树的一部分,因此无法参与此路由事件调度。 EventTrigger
使用给定的EventName
直接订阅CLR事件(使用反射:Type.GetEvent
)。
将使用以下顺序确定事件源对象:
SourceObject
的{{1}}属性,请尝试获取该对象。如果它不为空,请使用它。EventTrigger
SourceName
,请使用命名对象解析器获取对象。EventTrigger
直接附加到的关联对象。 EventTrigger
必须是简单的事件名称。不支持完全限定的事件名称(即EventName
)。这与Type.EventName
形成对比,您可以在System.Windows.EventTrigger
属性中指定完全限定的路由事件名称。
简而言之,您无法以这种方式简化RoutedEvent
。
也许您可以使用WrapPanel
ItemsControl
作为WrapPanel
,并定义包含ItemsPanel
DataTemplate
的{{1}}。