美好的一天,
我在这里绝望了。请考虑以下用例。
我有一个列表框,其中的项目是自定义模板控件。它有几个按钮,这个自定义控件的代码后面有事件处理程序。每当点击按钮时,我通过DataContext调用我的自定义控件绑定的对象的方法。因此,当用户点击停止时,我会调用_context.stopDownload(),而对象会执行其余操作。
但是,我有一个按钮,应该开始播放内容。我试图以某种方式在核心级别上听这个按钮的点击事件,而不是在代表列表框的项目UI的自定义控件后面的代码中。
所以,总结一下:
我无法弄清楚#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>
谢谢你们!
答案 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>