Как указать команду на кнопке, когда я использую шаблон в 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 ответа:
Почему ваш шаблон
Чтобы было понятно, что происходит, у вас есть внешний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>