2010-01-20 2 views
2

나는 나의 편집 버튼이 어떻게 보일지를 정의하는 Button 템플릿이 있습니다WPF에서 템플릿을 사용할 때 버튼에 명령을 지정하는 방법은 무엇입니까?

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

내가 (안 템플릿) 버튼을 만드는 곳 XAML에 Command를 선언합니다. 나는 ButtonCommand 속성을 설정할 때, 무시되는 것 :

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

내 구문 문제점은 무엇입니까?

(참고 :이 버튼에서 템플릿을 제거하면 Command이 작동하므로 템플릿을 사용하는 것이 좋습니다.)

답변

1

Button 템플릿에 다른 Button이 포함 된 이유는 무엇입니까? 그건 말이 안되며 템플릿이 암시 적으로 적용된 경우 StackOverflow가 어려워 질 것입니다. Image이어야하며,이 경우 명령이 작동해야합니다.

분명히 말하자면, ICommand이 올바르게 적용된 외부 Button이있는 것입니다. 그러나 그 안에 Image이있는 다른 Button으로 표시됩니다. 따라서 Image을 클릭하면 실제로 내부Button이 표시되며 ICommand과 연결되지 않습니다. 바깥 쪽 단추는 결코 클릭을 "보지"않으므로 명령을 실행하지 않습니다. 내가 권하고 싶지 않다,하지만 작동합니다

귀하의 유일한 옵션은 외부 버튼의 속성에 대한 내부 버튼을 바인드하는 것입니다 :

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

템플릿에서 Button을 제거하면 이미지 만 표시되므로 버튼 모양 안에 표시되지 않습니다. 내 버튼의 모양을 그 이미지가있는 버튼으로 만들고 GrayOutButtonStyle을 적용하고 싶습니다. 템플릿에 키가 설정되어 있으므로 재귀 적으로 적용되지 않는다고 생각합니다. Template = {정적 리소스 EditButton}을 명시 적으로 선언 한 경우에만 적용됩니다. 그게 맞지 않아? –

+0

템플릿에서이 작업을 수행 할 수 있습니다 (CommandParamater 만 바인딩하면됩니다).

+1

버튼에 이미지가 필요한 경우, "올바른 방법"은 템플릿을 전혀 사용하지 않고 내용으로 '이미지'가있는 'Button'을 선언하는 것입니다. 그렇지 않으면, 시작하기 좋은 곳은 기존의'Button' 템플릿을 복사하고 그것을 변경하는 것입니다. 블렌드가이를위한 최상의 도구입니다. XAMLPadX로 충분할 수 있습니다. –

0

명령을 참조하는 또 다른 방법입니다 다음과 같이 상대 바인딩 :

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