【问题标题】:WPF Datatemplate Click CommandWPF 数据模板点击命令
【发布时间】:2017-09-08 15:36:15
【问题描述】:

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

我想将Click Command 添加到DataTemplate 本身,而不是添加到DataTemplate 内的Item。就像当我在任何应该触发Command 的地方单击DataTemplate 时,任何人都可以教我吗?

谢谢!

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案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>
    

    要使上述代码正常工作,您需要通过转到Add Reference &gt; Assemblies &gt; ExtensionsSystem.Windows.Interactivity 程序集添加到您的项目中。

    编辑: 我相信我现在正确理解了您的问题。当你说你想添加Command

    关于数据模板,我不想在数据模板项中添加命令

    您的意思是您想编写像&lt;DataTemplate Command="{...}"&gt;&lt;DataTemplate Click="..."&gt; 这样的代码。

    一方面这是不可能的,因为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 中的命令而不在那里指定它?如果是这样,请给我几分钟,我已经在为此做一个示例。
    • 是的,就像您当前的方法一样,但我想要一些不同的方法而不添加 Interactivity.dll 以保持项目简单。
    • @BingFeng 据我所知,没有 inbuilt 方法可以做到这一点(inbuilt 指的是它们不包含在.dlls Visual Studio 已经添加为您的参考,例如System.XamlWindowsBase),但您可以使用MVVM Lights EventToCommand,即使这对您来说基本相同。
    • Thomas 感谢您的帮助,这对我很有帮助。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多