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

时间:2011-10-26 23:43:23

标签: c# silverlight xaml

我的问题非常类似于:(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逻辑。

谢谢, 巴林特

1 个答案:

答案 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事件时访问所需的所有信息。