当我在WPF中使用模板时,如何在Button上指定Command?

时间:2010-01-20 20:18:17

标签: wpf xaml button command controltemplate

我有一个Button模板来定义我的编辑按钮应该是什么样子:

<ControlTemplate x:Key="EditButton" TargetType="{x:Type Button}">
     <Button Style="{StaticResource GrayOutButtonStyle}" >
        <Image x:Name="editImage" Source="{StaticResource EditIcon}" />
     </Button>
</ControlTemplate>

我想在我创建按钮的XAML中声明Command(不在模板中)。但是当我在Command中设置Button属性时,它会被忽略:

<Button Template="{StaticResource EditButton}" 
        Command="{Binding Source={StaticResource ViewModel}, Path=EditCommand}" 
        CommandParameter="{Binding}" />

我的语法有什么问题?

(注意:如果我从此按钮​​中删除模板,那么Command可以正常工作,所以这就是使用模板搞砸了。)。

2 个答案:

答案 0 :(得分:1)

为什么您的Button模板包含另一个Button?这没有任何意义,如果您的模板是隐式应用的话,它会受到StackOverflow的影响。它应该只是Image,在这种情况下你的命令应该有效。

要明确的是,正在发生的事情是你有一个外部Button,它正确地应用了ICommand。但是,它被渲染为另一个Button,其中包含Image。因此,当您点击Image时,您实际上是点击内部 Button,其中没有ICommand与之关联。外部Button永远不会“看到”点击,因此它永远不会执行命令。

你唯一的其他选择,我不推荐,但应该工作,是让内部按钮绑定到外部按钮上的属性:

<ControlTemplate ...>
    <Button Command="{TemplateBinding Command}" CommandParameter="{Binding CommandParameter}" ...>
        <Image .../>
    </Button>
</ControlTemplate>

答案 1 :(得分:0)

引用该命令的另一个选项是相对绑定,如下所示:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
            <Button Command="{Binding Path=Command, RelativeSource={RelativeSource AncestorType=Button}}">
                <Image... />
            </Button>
        </ControlTemplate>
    </Setter.Value>
</Setter>