【发布时间】:2017-09-08 15:36:15
【问题描述】:
许多文章让DataTemplate 内的DataTemplate 项目有一个Command,但我不想这样做。
我想将Click Command 添加到DataTemplate 本身,而不是添加到DataTemplate 内的Item。就像当我在任何应该触发Command 的地方单击DataTemplate 时,任何人都可以教我吗?
谢谢!
【问题讨论】:
许多文章让DataTemplate 内的DataTemplate 项目有一个Command,但我不想这样做。
我想将Click Command 添加到DataTemplate 本身,而不是添加到DataTemplate 内的Item。就像当我在任何应该触发Command 的地方单击DataTemplate 时,任何人都可以教我吗?
谢谢!
【问题讨论】:
如果我正确理解您的问题,您可以将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>
要使上述代码正常工作,您需要通过转到Add Reference > Assemblies > Extensions 将System.Windows.Interactivity 程序集添加到您的项目中。
编辑:
我相信我现在正确理解了您的问题。当你说你想添加Command
关于数据模板,我不想在数据模板项中添加命令
您的意思是您想编写像<DataTemplate Command="{...}"> 或<DataTemplate Click="..."> 这样的代码。
一方面这是不可能的,因为DataTemplate 不是从DependencyObject 派生的,另一方面甚至没有必要。
如果您希望在单击ListBoxItem 时触发MouseDown 事件,无论单击其模板的哪个部分,您都可以将DataTemplates 模板包装在Grid(或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)。
【讨论】:
DataTemplate 中的命令而不在那里指定它?如果是这样,请给我几分钟,我已经在为此做一个示例。
System.Xaml 或WindowsBase),但您可以使用MVVM Lights EventToCommand,即使这对您来说基本相同。