gpt4 book ai didi

wpf - 如何在 WPF 中使用 Interaction.EventTrigger 和冒泡自定义事件

转载 作者:行者123 更新时间:2023-12-04 19:40:27 24 4
gpt4 key购买 nike

我正在尝试处理来自 UserControlRoutedEvent,我通过使用 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)。

事件源对象将使用以下顺序确定:

  1. 如果SourceObject EventTrigger 的属性(property)已设置,请尝试获取该对象。如果它不为 null,则使用它。
  2. 如果SourceNameEventTrigger已设置,使用命名对象解析器获取对象。
  3. 否则,使用关联对象 EventTrigger直接连接到。

EventName必须是一个简单的事件名称。不支持完全限定的事件名称(即 Type.EventName )。这与 System.Windows.EventTrigger 形成对比,您可以在其中指定完全限定的路由事件名称 RoutedEvent属性(property)。

简而言之,您无法简化您的 WrapPanel以这种方式。也许你可以使用 ItemsControlWrapPanel作为ItemsPanel并定义一个 DataTemplate包含你的 MyCustomUserControlEventTrigger

关于wpf - 如何在 WPF 中使用 Interaction.EventTrigger 和冒泡自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com