我的问题与此非常相似:( Binding events to buttons in an ItemsControl ) 但我没有在那里找到解决方案。 我有一个 ItemsControl,在它的 DataTemplate 中,我有另一个 ItemsControl。外部控件中的项目包含具有某些属性的类,其中一个属性是一个集合。内部 ItemsControl 源绑定(bind)到此集合,内部控件 DataTemplate 内部有一个 Button。
我的问题是,当我为按钮 (.. Click="dummyfunc") 连接一个事件并尝试运行该项目时,我得到一个未处理的 XamlParseException (4004) 并提示“无法分配给属性” System.Windows.Controls.Primitives.ButtonBase.Click'” 我在 Xaml 中放置外部 ItemsControl 的页面的代码隐藏中声明了我的事件处理程序。它适用于放置在外部控件 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
我想问题是事件没有冒泡,我得到了解析异常,因为解析器在实际范围内找不到事件处理程序声明,这显然不是内部控件的代码隐藏:(
我需要这个的原因是因为我想在代码中做一些自定义 UI 逻辑,并仅在此之后以某种方式触发 DeleteMe 逻辑。
谢谢, 巴林特
最佳答案
CallMethodAction
的 spartan 文档并不明显, 但由 MethodName
属性命名的方法可以具有以下任一签名:
无效方法()
void Method(object associatedObject, object 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
事件时访问所需的所有信息。
关于c# - 将事件绑定(bind)/连接到嵌套在 ItemsControls DataTemplate 中的 ItemsControl 中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910237/