Как указать команду на кнопке, когда я использую шаблон в WPF?


У меня есть шаблон Button, чтобы определить, как должна выглядеть моя кнопка редактирования:

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

Я хочу объявить Command в XAML, где я создаю кнопку (не в шаблоне). Но когда я устанавливаю атрибут Command в Button, он игнорируется:

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

Что не так с моим синтаксисом?

(Примечание: Если я удаляю шаблон из этой кнопки, то Command работает, так что это что-то об использовании шаблона, который портит его.).

2 2

2 ответа:

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

Чтобы было понятно, что происходит, у вас есть внешний Button, который правильно применяет к нему ICommand. Однако он визуализируется как другой Button с Image внутри него. Следовательно, когда вы щелкаете Image, Вы на самом деле щелкаете внутренний Button, который не имеет никакого ICommand, связанного с ним. Внешняя кнопка никогда не" видит " щелчок, поэтому она никогда не выполняет команду.

Ваш единственный другой вариант, который я бы не рекомендовал, но должен работать, - это привязка внутренней кнопки к свойствам на внешней кнопке:

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

Другой вариант ссылки на команду-относительная привязка, как показано ниже:

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