【问题标题】:Binding/Wiring events to button in an ItemsControl nested inside an ItemsControls DataTemplate绑定/连接事件到嵌套在 ItemsControls DataTemplate 中的 ItemsControl 中的按钮
【发布时间】:2011-10-26 23:43:22
【问题描述】:

我的问题与此非常相似:(Binding events to buttons in an ItemsControl) 但我没有在那里找到解决方案。 我有一个 ItemsControl,在它的 DataTemplate 中,我有另一个 ItemsControl。外部控件中的项目包含具有某些属性的类,其中一个属性是集合。内部 ItemsControl 源绑定到此集合,内部控件 DataTemplate 内部有一个 Button。

我的问题是,当我为按钮 (.. Click="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 逻辑。

谢谢, 巴林特

【问题讨论】:

    标签: c# silverlight xaml


    【解决方案1】:

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

    【讨论】:

    • 不定义TargetObject怎么可能触发点击事件呢?我想不在对象中处理事件,而是在包含嵌套 ItemsControls 的页面的 CodeBehind 中处理事件,因为我认为 UI 逻辑应该在页面的 CodeBehind 中完成,而不是在只保存数据的对象中。
    • 您可以随意设置TargetObject,例如TargetObject="{Binding ElementName=mainPage}"
    • 啊,非常感谢,现在它就像一个魅力! :)(顺便说一句,我对那个冒泡的事情是对的吗?或者你怎么看,当我只是写到内部项目控件中的按钮时导致问题的原因:Click="dummyfunc" ?)
    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 2015-03-25
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多