许多文章都让DataTemplate
内的DataTemplate
项目有Command
,但我不想这样做。
我想向Click
本身添加Command
DataTemplate
,而不是Item
内的DataTemplate
。就像当我点击DataTemplate
它应该触发Command
时,任何身体都可以教我吗?
谢谢!
答案 0 :(得分:1)
如果我正确理解您的问题,您可以将EventTrigger
与InvokeCommandAction
结合使用,例如以下代码:
首先,添加此命名空间定义:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
然后在DataTemplate
定义中:
<DataTemplate>
<Label Content="{Binding}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding Path=DataContext.YourClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourControl}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Label>
</DataTemplate>
要使上述代码生效,您需要转到System.Windows.Interactivity
将Add Reference > Assemblies > Extensions
程序集添加到项目中。
编辑:
我相信我现在正确理解你的问题。当您说要添加Command
在datatemplate上,我不想在datatemplate项目
中添加命令
您的意思是您想要编写代码,例如<DataTemplate Command="{...}">
或<DataTemplate Click="...">
。
一方面这是不可能的,因为DataTemplate
并非来自DependencyObject
,另一方面甚至不需要。
如果您希望在单击MouseDown
时触发ListBoxItem
事件,则无论单击其模板的哪个部分,您都可以将DataTemplate
模板包装在{Grid
中。 1}}(或StackPanel
或任何其他容器)并将Interaction.Triggers
应用于该容器:
<DataTemplate>
<Grid Background="Transparent">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding Path=DataContext.YourClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourControl}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<Label Content="{...}" />
<Label Content="{...}" />
<Label Content="{...}" />
</Grid>
</DataTemplate>
现在,无论您点击了什么标签,MouseDown
事件都将始终触发(请注意,为此,您需要为容器提供背景,否则为hit test does not work)。