WPF Datatemplate单​​击命令

时间:2017-09-07 14:27:06

标签: c# wpf mvvm

许多文章都让DataTemplate内的DataTemplate项目有Command,但我不想这样做。

我想向Click本身添加Command DataTemplate,而不是Item内的DataTemplate。就像当我点击DataTemplate它应该触发Command时,任何身体都可以教我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您可以将EventTriggerInvokeCommandAction结合使用,例如以下代码:

首先,添加此命名空间定义:

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.InteractivityAdd 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)。