我有一个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
可以正常工作,所以这就是使用模板搞砸了。)。
答案 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>