我的问题非常类似于:(Binding events to buttons in an ItemsControl)但我没有在那里找到解决方案。 我有一个ItemsControl,在其DataTemplate中,我有另一个ItemsControl。外部控件中的项包含具有某些属性的类,其中一个属性是集合。内部ItemsControl源绑定到此集合,并在内部控件DataTemplate内部有一个Button。
我的问题是,当我为按钮连接事件(.. Click =“dummyfunc”)并尝试运行项目时,我得到一个未处理的XamlParseException(4004)并说“无法分配给属性” System.Windows.Controls.Primitives.ButtonBase.Click'” 我在页面的CodeBehind中声明了我的事件处理程序,其中外部ItemsControl放置在Xaml中。它适用于放置在外部控件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逻辑。
谢谢, 巴林特
答案 0 :(得分:3)
CallMethodAction
的spartan文档中并不明显,但MethodName
属性命名的方法可以包含以下任一签名:
void Method()
void Method(object associatedObject, object parameter)
此外,parameter
操作的默认EventTrigger
是事件参数值,通常作为第二个参数传递给事件处理程序。对于Click
事件,参数的类型为RoutedEventArgs
,因此您可以像这样定义DeleteMe
方法:
public void DeleteMe(object sender, RoutedEventArgs e)
{
Debug.WriteLine("sender: {0}", sender);
Debug.WriteLine("e.OriginalSource: {0}", e.OriginalSource);
}
这使您可以在处理Click
事件时访问所需的所有信息。