Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Silverlight、DataTemplate、绑定到click事件_C#_Silverlight_Events_Listbox_Datatemplate - Fatal编程技术网

C# Silverlight、DataTemplate、绑定到click事件

C# Silverlight、DataTemplate、绑定到click事件,c#,silverlight,events,listbox,datatemplate,C#,Silverlight,Events,Listbox,Datatemplate,你好 我在这里越来越绝望了。考虑下面的用例。 我有一个列表框,其中的项是自定义模板控件。它有几个按钮,此自定义控件在代码隐藏中为其提供事件处理程序。无论何时单击按钮,我都会通过DataContext调用我的自定义控件绑定到的对象的方法。所以,当用户单击stop时,我调用_context.stopDownload(),剩下的由object完成 但是,我有一个按钮,应该开始播放的内容。我试图在核心级别上,而不是在表示listbox的项目UI的自定义控件的代码中,以某种方式侦听此按钮的单击事件 因此,

你好

我在这里越来越绝望了。考虑下面的用例。

我有一个列表框,其中的项是自定义模板控件。它有几个按钮,此自定义控件在代码隐藏中为其提供事件处理程序。无论何时单击按钮,我都会通过DataContext调用我的自定义控件绑定到的对象的方法。所以,当用户单击stop时,我调用_context.stopDownload(),剩下的由object完成

但是,我有一个按钮,应该开始播放的内容。我试图在核心级别上,而不是在表示listbox的项目UI的自定义控件的代码中,以某种方式侦听此按钮的单击事件

因此,总结一下:

  • 我有一个核心对象,它将项目列表加载到可观察的集合中
  • 然后,此核心对象使用GetTemplateChildnren获取listbox对象。完成此操作后,core将listbox控件的ItemsSource设置为我在#1步骤中得到的可观察集合。listbox以自定义模板控件作为其项(使用DataTemplate)呈现
  • 我需要将核心对象级别上的事件处理程序链接到DataTemplate中自定义控件的button元素
  • 我不明白。除此之外,在设置ItemsSource以连接事件处理程序之后,我尝试过这样做,但容器总是空的

    DownloadsListElement.ItemsSource = _downloadsList;
    
    foreach (var item in DownloadsListElement.ItemsSource)
    {
        var container = DownloadsListElement.ItemContainerGenerator.ContainerFromItem(item) as     FrameworkElement;
    }
    
    我还尝试过在列表框上按一个网格按钮,并尝试使用网格的MouseLeftButtonDown/Up上的VisualTreeHelper单击按钮,但当我单击按钮时,这些按钮从未被调用

    我认为唯一可能的解决方案是,当我在某个全局对象中注册事件处理程序,然后从DataTemplate中的自定义控件调用它时,使用某种命令模式

    我没有主意了,希望有人有类似的问题

    多谢各位

    更新

    多亏了McGamagle和ChrisW,我才让它工作起来。按钮上的最终代码如下所示:

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <ei:CallMethodAction TargetObject="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=local:ListBoxExt}}" MethodName="PlayButton_Click"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    
    
    

    谢谢你们

    我的理解是,您希望将处理程序附加到ListBox项的DataTemplate中的项,其中处理程序属于父项的DataContext

    您可以使用
    相对资源FindAncestor
    绑定来完成此操作。您可能需要考虑使用<代码> ICOMMand <代码>而不是处理程序,但是如果您确实需要一个处理程序,那么可以使用Posier-SDK的.< /P> XAML应该是这样的(其中“SomeCommand”是ListBox数据上下文的
    ICommand
    属性):

    
    
    或者使用“CallMethodAction”技术(此处“HandleButtonClick”必须是列表框数据上下文的公共方法):

    
    
    Throw
    ClickMode=“Press”
    在模板中的按钮上,你应该让你的事件触发任何东西。对不起,我不知道这是如何解决我的问题的。我可以请你澄清一下吗?我在DataTemplate中有一个自定义控件,这个自定义控件有一个按钮。我需要能够将事件处理程序连接到自定义控件外部的这个按钮。非常感谢。哦,我以为您在接收ListBox项的DataTemplate中的按钮的单击事件时遇到了问题。你不能只显式地设置DataContext吗?对不起,你能在代码中显示你的想法吗?DataContext是在我设置其ItemsSource时在listbox上设置的。我只是想了解如何将事件处理程序绑定到DataTemplate内的控件。如果这是不可能的,我想我将使用一些全球消息或其他东西(发布/订阅模式)。当我坐在这里键入+1@ChrisW. 哈,对不起——无论如何你都应该发布你的答案,或者你真的有相同的想法吗?是的,只是通过datacontext到达了路径,几乎是一样的,因为我通常都是这样做的。非常感谢你的耐心和及时的回复,伙计们!
    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding RelativeSource={RelativeSource AncestorType=ListBox},
                                          Path=DataContext.SomeCommand}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    
    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ei:CallMethodAction 
                                TargetObject="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=DataContext.SomeCommand}" 
                                MethodName="HandleButtonClick" />
                        </i:EventTrigger EventName="Click">
                    </i:Interaction.Triggers>
                </Button>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>