Переопределение шаблонной команды кнопки в WPF - PullRequest
4 голосов
/ 18 января 2010

У меня есть ControlTemplate, который я использую для изменения внешнего вида и поведения нескольких Button с. Я хочу, чтобы только часть Button была кликабельной и выполняла ограничение Command, поэтому я добавил Button в ControlTemplate и привязал его к свойству Command шаблона.

Проблема, с которой я столкнулся, заключается в том, что, поскольку я определяю привязку Command для шаблонного Button, она выполняется независимо от того, какую часть шаблона я нажимаю.

В приведенном ниже примере вы можете нажать 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, а присоединенные свойства все равно будут давать мне такое же поведение.

Ответы [ 2 ]

1 голос
/ 19 января 2010

Другой альтернативой является повторное создание шаблона другого элемента управления, такого как Border, и использование RoutedCommand для Button внутри шаблона. Вы можете привязать его к одной из встроенных команд RoutedCommands, например ApplicationCommands.Save, и в XAML для содержащего элемента управления добавить CommandBinding для этой конкретной команды. Дайте мне знать, если какой-то код будет полезен.

1 голос
/ 18 января 2010

Это грязный хак, но вы можете вместо этого связать свойство Command внутренней кнопки со свойством Tag шаблонного родителя. Таким образом, вы «скрываете» команду от содержащей ее кнопки, но внутренняя кнопка тайно знает, как к ней добраться.

Вы можете оставить CommandParameter как есть, поскольку он сам по себе не действует.

...