将事件绑定/连接到嵌套在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
从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
事件时所需的所有信息。