2010-07-08 13 views
8

Sto cercando di capire il modo migliore per creare uno stile/trigger per impostare il primo piano su Rosso, quando il valore è < 0. qual è il modo migliore per farlo? Sto assumendo DataTrigger, ma come posso verificare il valore negativo, devo creare il mio IValueConverter?WPF TextBlock Numero negativo in rosso

risposta

14

Se non si utilizza un modello MVVM (dove si può avere una proprietà ForegroundColor), la cosa più semplice da fare è creare un nuovo IValueConverter, associando lo sfondo al valore.

In MyWindow.xaml:

<Window ... 
    xmlns:local="clr-namespace:MyLocalNamespace"> 
    <Window.Resources> 
     <local:ValueToForegroundColorConverter x:Key="valueToForeground" /> 
    <Window.Resources> 

    <TextBlock Text="{Binding MyValue}" 
       Foreground="{Binding MyValue, Converter={StaticResource valueToForeground}}" /> 
</Window> 

ValueToForegroundColorConverter.cs

using System; 
using System.Windows.Media; 
using System.Windows.Data; 

namespace MyLocalNamespace 
{ 
    class ValueToForegroundColorConverter: IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      SolidColorBrush brush = new SolidColorBrush(Colors.Black); 

      Double doubleValue = 0.0; 
      Double.TryParse(value.ToString(), out doubleValue); 

      if (doubleValue < 0) 
       brush = new SolidColorBrush(Colors.Red); 

      return brush; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 
} 
+0

questo dovrebbe funzionare , anche se preferirei creare una sorta di stile (più facile da reimplementare), perché questo non funzionerebbe con MVVM? –

+2

@LnDCobra: Funzionerà con MVVM. Quello che penso Wonko significa che con MVVM puoi scegliere di esporre una proprietà ForegroundColor sul tuo viewmodel invece di usare ValueConverter. –

+1

@Jakob: assolutamente corretto. @LnDCobra: è possibile implementare uno stile, con il valore della proprietà in primo piano impostato sullo stesso legame di cui sopra.

8

Si dovrebbe avere tue informazioni specifiche vista nel vostro ViewModel. Ma puoi eliminare le informazioni specifiche di stile nel ViewModel.

creare qui una proprietà nel ViewModel che restituisce un valore booleano

public bool IsMyValueNegative { get { return (MyValue < 0); } } 

e utilizzarlo in un DataTrigger in modo da poter eliminare il ValueConverter e la sua boxe/unboxing.

<TextBlock Text="{Binding MyValue}"> 
    <TextBlock.Style> 
    <Style> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsMyValueNegative}" Value="True"> 
      <Setter Property="Foreground" Value="Red" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

Concordato che questo sarebbe preferibile. La risposta originale deriva dal fatto che non ha menzionato che stava usando MVVM, e la domanda implicava (per me) che non lo fosse. –

+0

Funzionerebbe, ma il motivo per cui non voglio farlo è perché per ogni TextBlock avrei bisogno di una proprietà separata per ogni blocco di testo (10+ per visualizzazione spesso) –

+0

Solo un piccolo punto sulle convenzioni di denominazione .. Le mie app diventare così pieno di questo tipo di xaml hack che trovo molto più facile chiamarli per scopo. es: public bool DisplayBasketValueInRed {get; impostato; }. Io uso anche (anche se probabilmente non dovrei) una classe generica per ridurre il modo verboso di implementare INotifyPropertyChanged su queste proprietà. –

4

Per la soluzione di Amsakanna ho dovuto aggiungere un nome di classe al Setter Proprietà:

< Setter proprietà = "TextBlock .Foreground" value = "Red" />

+0

anch'io !. Grazie! – tzippy

Problemi correlati