2010-01-18 85 views
4

我有一个ControlTemplate,我用它来改变几个Button的外观和行为。我只希望部分Button可点击并执行绑定Command,因此我在ControlTemplate内添加了Button,并将其绑定到模板的Command属性。在WPF中重写模板按钮的命令

我遇到的问题是,由于我在模板化的Button上定义了Command绑定,因此无论我点击哪个模板部分,它都会执行。

在下面的示例中,您可以单击Border并执行Command。如何更改它,以便Command仅在您单击模板内的Button时执行?

<ControlTemplate x:Key="ButtonControlTemplate" TargetType="{x:Type Button}"> 
    <Border BorderThickness="10" BorderBrush="Black"> 
     <Button 
      Command="{TemplateBinding Command}" 
      CommandParameter="{TemplateBinding CommandParameter}" > 
      <ContentPresenter Content="{TemplateBinding Content}" /> 
     </Button> 
    </Border> 
</ControlTemplate> 

... 

<Button 
    Command="{Binding Path=SomeViewmodelCommand}" 
    CommandParameter="{Binding Path=SomeViewmodelCommandParameter}" 
    Content="Click" 
    Template="{StaticResource ButtonControlTemplate}" /> 

我不认为我能模板不同的元素(如Border),因为我还需要在Command某种方式通过,并附加属性仍然给我相同的行为。

回答

1

这是一个肮脏的黑客攻击,但您可以将内部按钮的Command属性绑定到模板父项的Tag属性。这样你可以隐藏包含按钮的命令,但内部按钮秘密知道如何去到它。

您可以按原样保留CommandParameter,因为它本身不起作用。

1

另一种替代方法是重新模板另一个控件,如边框,并在模板中的Button上使用RoutedCommand。您可以将它绑定到其中一个内置的RoutedCommands,例如ApplicationCommands.Save,并在包含控件的XAML中为该特定命令添加一个CommandBinding。让我知道,如果一些代码会有所帮助。