2012-01-09 4 views
1

私はそれが選択されているかどうかに応じて別のイメージを表示するTabItemを取得しようとしています。今すぐ次のコードを使用して作業しています。WPFのトリガでテンプレートの単一の属性を変更する方法はありますか?

<Window.Resources> 
    <local:UnselectedImageFilenameConverter x:Key="UnselectedImageFilenameConverter" /> 
    <local:SelectedImageFilenameConverter x:Key="SelectedImageFilenameConverter" /> 
    <Style TargetType="TabItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TabItem"> 
        <Image Source="{TemplateBinding Header, Converter={StaticResource UnselectedImageFilenameConverter}}" Stretch="None" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="Template" > 
        <Setter.Value> 
         <ControlTemplate TargetType="TabItem"> 
          <Image Source="{TemplateBinding Header, Converter={StaticResource SelectedImageFilenameConverter}}" Stretch="None" /> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

これはかなり冗長なようです。私が必要とするのは、画像ソースを変更することだけです。これを行うためのより簡潔な方法があるように思われるが、これまでのところ運がない。何か案は?

答えて

3

スタイルの代わりにコントロールテンプレートを使用できます。その中に、あなたの気まぐれに応じて画像ソースを変更するトリガーを定義することができます。

<ControlTemplate TargetType="{x:Type TabItem}" x:Key="TabItemTemplate"> 
    <Image x:Name="TabImage" Source="{Binding Something}"/> 
    <ControlTemplate.Triggers> 
     <Trigger Property="Selector.IsSelected" Value="True"> 
      <Setter Property="Source" TargetName="TabImage" Value="{Binding SomethingElse}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

上記のテンプレートで、テンプレートをデフォルトですべてのタブ項目に適用する場合は、x:Key属性を削除します。

+0

ソースバインディングを{Binding RelativeSource = {RelativeSource TemplatedParent}、Path = Header、Converter = {StaticResource UnselectedImageFilenameConverter}}に変更する必要がありました。 –

+0

それはあなたのために働いてうれしい! – CodeWarrior

関連する問題