2013-04-04 14 views
6

mam różne elementy w stylu mojej WPF XAML, które są takie same z wyjątkiem danych, własności wiązania, np:konsolidacyjne wspólne style WPF

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

styl jest stosowany do kontroli jak:

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

Czy istnieje sposób, w jaki mogę skonsolidować mój HasAlphaStyle i HasBetaStyle, tak aby setery własności nie musiały być duplikowane? Jedyna różnica między nimi to Binding Path do nieruchomości.

+1

ciekawe pytanie, jest celu konsolidacji, abyś mógł utrzymać tylko jeden zestaw wartości dla seterów? Czy chcesz móc zastosować to tylko do TextBlocks lub dowolnego elementu FrameworkElement? – Dutts

+0

1. Tak; 2. Każdy zestaw ustawiaczy, które mogą być używane wielokrotnie dla każdego FrameworkElement –

Odpowiedz

3

Utworzę załączoną właściwość i będę mieć na nią swoje wyzwalacze zamiast wyzwalaczy danych. przykładowy kod jak poniżej:

dołączony obiekt

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

a następnie Twój styl połączony staną

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

i można pisać TextBlocks jak

<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

czym są "zachowania:"? czy to jest przestrzeń nazw? W jakim obszarze nazw znajduje się TextBlockBehavior? –

+0

@Stealth Rabbi - Tak, to jest przestrzeń nazw, zapoznaj się z tą arytmetą [How to: Import a Namespace to XAML] (http://msdn.microsoft.com/en-gb/library/bb514546 (v = vs.90) .aspx) o zaimportowaniu przestrzeni nazw Clr również w XAML – sthotakura

+0

, czy TextBlockBehavior musi dziedziczyć coś? –

Powiązane problemy