Come sapete ad uno style è possibile associare un trigger, l'esempio che segue, ad esempio, cambia il colore di sfondo della textbox quando questa ha il focus.

   1:  <Style TargetType="{x:Type TextBox}">
   2:  <Setter Property="FontFamily" Value="Tahoma" />
   3:  <Setter Property="Margin" Value="10" />
   4:  <Style.Triggers>
   5:  <Trigger Property="IsFocused" Value="True">
   6:  <Setter Property="Background" Value="LightGreen" />
   7:  </Trigger>
   8:  </Style.Triggers>
   9:  </Style>

A questo punto la domanda è: Come faccio a impostare un trigger con una condizione che va oltre il classico valore=X?, ad esempio, come faccio ad applicare uno stile quando un determinato valore è inferiore (o superiore) ad una certa soglia?
Al momento l'unica soluzione che mi è venuta in mente (si accettano suggerimenti) è quella di usare un DataTrigger bindato a un "proxy" object che elaborerà la/le condizioni.

   1:  class MyTriggerSource:INotifyPropertyChanged
   2:    {
   3:     public event PropertyChangedEventHandler PropertyChanged;
   4:     private int _value;
   5:     public int Mode { get; set; }
   6:     public int Threshold { get; set; }
   7:     public bool IsSet { get; private set; }
   8:     public int Value
   9:     {
  10:      get { return _value; }
  11:      set
  12:      {
  13:        if (value != _value)
  14:        {
  15:         bool isSet=false;
  16:         switch (Mode)
  17:         {
  18:          case 0: // >
  19:            isSet = value > Threshold;
  20:            break;
  21:          case 1: // <
  22:            isSet = value < Threshold;
  23:            break;
  24:          case 2: // ==
  25:            isSet = value.Equals(Threshold);
  26:            break;
  27:          default:
  28:            throw new NotSupportedException();
  29:         }      
  30:         _value = value;
  31:         if(isSet!=IsSet)
  32:         {
  33:          IsSet=isSet;
  34:          OnIsSetChanged();
  35:         }
  36:        }
  37:      }
  38:     }
  39:     private void OnIsSetChanged ()
  40:     {
  41:      if (PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs("IsSet"));
  42:     }
  43:    }

Questo oggetto può essere utilizzato in questo modo:

   1:  <Window x:Class="CSWpfCustomTrigger.Window1"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:local="clr-namespace:CSWpfCustomTrigger"
   5:      Title="Window1" Height="300" Width="300">
   6:    <Window.Resources>
   7:      <local:MyTriggerSource x:Key="mts" Threshold="50" Mode="1" Value="0"  />
   8:      <Style TargetType="{x:Type TextBox}">
   9:        <Style.Triggers>
  10:          <DataTrigger Binding="{Binding Source={StaticResource mts}, Path=IsSet}" Value="True">
  11:            <Setter Property="Background" Value="Yellow" />
  12:          </DataTrigger>
  13:        </Style.Triggers>
  14:      </Style>
  15:    </Window.Resources>
  16:    <Grid>
  17:      <TextBox Height="21" Margin="25,35,133,0" Name="textBox1" VerticalAlignment="Top" />
  18:      <Slider Margin="25,115,43,120" Name="slider1" Maximum="100" Value="{Binding Source={StaticResource mts}, Path=Value}"/>
  19:    </Grid>
  20:  </Window>

Ottenendo una textbox il cui colore di sfondo è giallo fintantochè il valore dello slider e inferiore a 50.
As usual, il codice va preso "as-is", quindi non sparate sul blogger (che nello specifico sarei io smile_regular)