2013-04-04 12 views
6

Ich habe verschiedene Stilelemente in meinem WPF XAML, die die gleichen, außer für die Datenbindungseigenschaft sind zB:Konsolidieren gemeinsamer WPF Styles

<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> 

Der Stil mit einem Kontroll angewandt wird:

<TextBlock Style="{StaticResource HasAlphaStyle}" .../> 

Gibt es eine Möglichkeit, dass ich meinen HasAlphaStyle und HasBetaStyle konsolidieren kann, damit die Property Setter nicht dupliziert werden müssen? Der einzige Unterschied zwischen den beiden ist der Bindungspfad zur Eigenschaft.

+1

Interessante Frage zu schreiben, ist die Zweck der Konsolidierung, so dass Sie nur einen Satz von Werten für die Setter beibehalten können? Möchten Sie dies nur auf TextBlocks oder ein beliebiges FrameworkElement anwenden können? – Dutts

+0

1. Ja; 2. Eine Menge von Setter, die für jedes FrameworkElement wiederholt verwendet werden könnten –

Antwort

3

Ich würde eine angefügte Eigenschaft erstellen und haben meine Trigger auf, anstatt Daten auszulösen. Beispielcode wie folgt:

Befestigt Property

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); 
     } 
} 

und dann würde Ihr kombinierter Stil

<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> 

werden und Sie können Ihre Textblöcke als

<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

Was ist "behaviours:"? ist das ein Namespace? In welchem ​​Namensraum befindet sich TextBlockBehavior? –

+0

@Stealth Rabbi - Ja, es ist ein Namespace, lesen Sie bitte diesen Artikel [Vorgehensweise: Importieren eines Namespaces in XAML] (http://msdn.microsoft.com/en-gb/library/bb514546 (v = vs.90)) .aspx) über den Import von Clr Namespaces in XAML – sthotakura

+0

auch, muss TextBlockBehavior von etwas erben? –