Silverlight,DataTemplate,绑定到单击事件

时间:2014-12-01 16:32:42

标签: c# silverlight events listbox datatemplate

美好的一天,

我在这里绝望了。请考虑以下用例。

我有一个列表框,其中的项目是自定义模板控件。它有几个按钮,这个自定义控件的代码后面有事件处理程序。每当点击按钮时,我通过DataContext调用我的自定义控件绑定的对象的方法。因此,当用户点击停止时,我会调用_context.stopDownload(),而对象会执行其余操作。

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

所以,总结一下:

  1. 我有一个核心对象,它将项目列表加载到可观察集合中。
  2. 然后,此核心对象使用GetTemplateChildnren获取列表框对象。完成后,core将listbox控件的ItemsSource设置为我在#1步骤上的可观察集合。列表框将使用自定义模板控件作为其项目(使用DataTemplate)进行渲染。
  3. 我需要将核心对象级别的事件处理程序链接到DataTemplate中自定义控件的按钮元素。
  4. 我无法弄清楚#3。除此之外,我在设置ItemsSource以连接事件处理程序后尝试做类似的事情,但容器始终为null。

    DownloadsListElement.ItemsSource = _downloadsList;
    
    foreach (var item in DownloadsListElement.ItemsSource)
    {
        var container = DownloadsListElement.ItemContainerGenerator.ContainerFromItem(item) as     FrameworkElement;
    }
    

    我还尝试在列表框上按一个网格,并尝试在Grid的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>
    

    谢谢你们!

1 个答案:

答案 0 :(得分:3)

我的理解是你想要将一个处理程序附加到ListBox项的DataTemplate中的一个项,其中处理程序属于父的DataContext。

您可以使用RelativeSource FindAncestor绑定执行此操作。您可能需要考虑使用ICommand而不是处理程序,但如果确实需要处理程序,则可以使用Blend SDK&#39; CallMethodAction

XAML看起来应该是这样的(其中&#34; SomeCommand&#34;是ListBox数据上下文的ICommand属性):

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding RelativeSource={RelativeSource AncestorType=ListBox},
                                      Path=DataContext.SomeCommand}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

或者使用&#34; CallMethodAction&#34;技术(这里&#34; HandleButtonClick&#34;必须是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>