Как указать команду на кнопке, когда я использую шаблон в 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>