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