将事件绑定/连接到嵌套在ItemsControls DataTemplate中的ItemsControl中的按钮

本文关键字:中的 DataTemplate ItemsControl 按钮 ItemsControls 绑定 事件 连接 嵌套 | 更新日期: 2023-09-27 18:12:35

我的问题与此非常相似:(将事件绑定到ItemsControl中的按钮)但我没有找到解决方案。我有一个ItemsControl,在它的DataTemplate中,我有另一个ItemsControl。外部控件中的项包含具有某些属性的类,其中一个属性是集合。内部ItemsControl源被绑定到这个集合,并且在内部控件DataTemplate中有一个Button。

我的问题是,当我为按钮连接一个事件…点击="dummyfunc"),并尝试运行项目,我得到一个未处理的XamlParseException(4004),并说"未能分配属性'System.Windows.Controls.Primitives.ButtonBase.Click'"我在Xaml中放置外部ItemsControl的页面的CodeBehind中声明了我的事件处理程序。它可以很好地用于放置在外部控件DataTemplate中的按钮。但是在内部控件模板中,我不能连接任何事件。

<HyperlinkButton  Content="x">
     <i:Interaction.Triggers>
         <i:EventTrigger EventName="Click">
             <ei:CallMethodAction MethodName="DeleteMe" TargetObject="{Binding}"/>                            
         </i:EventTrigger>
     </i:Interaction.Triggers>             
</HyperlinkButton>

但是这只触发了一个方法(DeleteMe),这个方法是在我上面提到的项目中实现的,它有一些属性和一个集合。

但是,我需要用通常的方法来处理内部控件中的事件:

public void dummyfunc(object sender, RoutedEventArgs e){...}

(这样我就可以得到触发事件的按钮,例如:

sender as HyperinkButton 

e.OriginalSource as HyperlinkButton

我认为问题是事件没有冒泡,我得到解析异常,因为解析器无法在实际范围内找到事件处理程序声明,这显然不是内部控制的CodeBehind:(

我需要这个的原因是因为我想在代码中做一些自定义的UI逻辑,并在此之后触发DeleteMe逻辑。

谢谢,Balint

将事件绑定/连接到嵌套在ItemsControls DataTemplate中的ItemsControl中的按钮

CallMethodAction的spartan文档中并不明显,但是由MethodName属性命名的方法可以具有以下签名之一:

  • void Method()
  • void Method(object associatedObject, object parameter)

此外,EventTrigger动作的默认parameter是通常作为第二个参数传递给事件处理程序的事件参数值。对于Click事件,参数的类型是RoutedEventArgs,因此您可以这样定义DeleteMe方法:

public void DeleteMe(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("sender: {0}", sender);
    Debug.WriteLine("e.OriginalSource: {0}", e.OriginalSource);
}

这使您可以访问处理Click事件时所需的所有信息。