Как мне указать Command on Button, когда я использую шаблон в WPF? - PullRequest
2 голосов
/ 20 января 2010

У меня есть шаблон 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 ]

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

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

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

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

<ControlTemplate ...>
    <Button Command="{TemplateBinding Command}" CommandParameter="{Binding CommandParameter}" ...>
        <Image .../>
    </Button>
</ControlTemplate>
0 голосов
/ 08 июня 2016

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

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