2013-04-04 16 views
6

私はデータバインディングプロパティ以外は同じです、私のWPFのXAMLの様々なスタイルの要素、例えばを持っている:統合共通WPFのスタイル

<TextBlock Style="{StaticResource HasAlphaStyle}" .../> 
:スタイルは次のように制御に適用される

<Style x:Key="HasAlphaStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
      <Setter Property="Background" Value="Red"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="FontWeight" Value="Bold"/>     
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}" Value="False"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="Foreground" Value="Black"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<Style x:Key="HasBetaStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
      <Setter Property="Background" Value="Red"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="FontWeight" Value="Bold"/>     
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}" Value="False"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="Foreground" Value="Black"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

プロパティ設定ツールを複製する必要がないように、HasAlphaStyleとHasBetaStyleを統合する方法はありますか? 2つの唯一の違いは、プロパティへのバインディングパスです。

+1

興味深い質問として、あなたのテキストブロックを書くことができ、ありますセッターの値を1つだけ維持できるように、統合の目的?これをTextBlocksまたはFrameworkElementだけに適用できるようにしたいですか? – Dutts

+0

1.はい。 2.任意のFrameworkElementに対して繰り返し使用できるセッターのセット –

答えて

3

私は、データトリガーを持つ代わりに、添付されたプロパティを作成し、トリガーを持っています。以下のようにサンプルコード:

プロパティ

添付

public static class TextBlockBehavior 
{ 
     public static readonly DependencyProperty HasValueProperty = 
      DependencyProperty.RegisterAttached("HasValue", typeof(bool), typeof(TextBlockBehavior), 
      new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.None)); 

     public static void SetHasValue(DependencyObject depObject, bool value) 
     { 
      depObject.SetValue(HasValueProperty, value); 
     } 

     public static bool GetHasValue(DependencyObject depObject) 
     { 
      return (bool)depObject.GetValue(HasValueProperty); 
     } 
} 

してから組み合わせたスタイルが

<Style x:Key="HasValueStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <Trigger Property="behaviors:TextBlockBehavior.HasValue" Value="True"> 
      <Setter Property="Background" Value="Red"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="FontWeight" Value="Bold"/>     
     </Trigger> 
     <Trigger Property="behaviors:TextBlockBehavior.HasValue" Value="False"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="Foreground" Value="Black"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

になると、あなたは

<TextBlock Style="{StaticResource HasValueStyle}" 
      behaviors:TextBlockBehavior.HasValue="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}"   .../> 

<TextBlock Style="{StaticResource HasValueStyle}" 
      behaviors:TextBlockBehavior.HasValue="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}"   .../> 
+0

'behaviors:'は何ですか?それは名前空間ですか? TextBlockBehaviorはどのネームスペースですか? –

+0

@Stealth Rabbi - はい、これは名前空間です。このaritcleを参照してください。[How to:XAMLに名前空間をインポートする](http://msdn.microsoft.com/en-gb/library/bb514546(v=vat90) ).aspx)XAML – sthotakura

+0

のclr名前空間のインポートについても、TextBlockBehaviorは何かから継承する必要がありますか? –

関連する問題