2010-07-08 6 views
8

J'essaie de comprendre la meilleure façon de créer un style/déclencheur pour mettre en avant-plan en rouge, lorsque la valeur est < 0. Quelle est la meilleure façon de le faire? Je suppose DataTrigger, mais comment puis-je vérifier la valeur négative, dois-je créer mon propre IValueConverter?WPF TextBlock Nombre négatif en rouge

Répondre

14

Si vous n'utilisez pas un modèle MVVM (où vous pouvez avoir une propriété ForegroundColor), la solution la plus simple est de créer un nouveau IValueConverter, en liant votre arrière-plan à votre valeur.

En 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

Cela fonctionnerait , bien que je préfère créer une sorte de style (plus facile à réimplémenter), pourquoi cela ne fonctionnerait-il pas avec MVVM? –

+2

@LnDCobra: Cela fonctionnera avec MVVM. Ce que je pense que Wonko veut dire avec MVVM, vous pouvez choisir d'exposer une propriété ForegroundColor sur votre viewmodel au lieu d'utiliser un ValueConverter. –

+1

@Jakob: absolument correct. @LnDCobra: vous pouvez implémenter un Style, avec la valeur de la propriété Foreground définie sur la même liaison que ci-dessus.

8

Vous devriez avoir votre point de vue des informations spécifiques dans votre ViewModel. Mais vous pouvez vous débarrasser des informations spécifiques au style dans le ViewModel.

créer Par conséquent une propriété dans le ViewModel qui retourne une valeur bool

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

et l'utiliser dans un DataTrigger de sorte que vous pouvez éliminer le ValueConverter et sa 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

préférable. La réponse originale provient du fait qu'il n'a pas mentionné qu'il utilisait MVVM, et la question impliquait (pour moi) qu'il ne l'était pas. –

+0

Cela fonctionnerait, mais la raison pour laquelle je ne veux pas faire cela est parce que pour chaque TextBlock je aurais besoin d'une propriété distincte pour chaque bloc de texte (10+ par vue souvent) –

+0

Juste un petit point sur les conventions de nommage .. Mes applications si plein de ce genre de bidouille de xaml que je trouve beaucoup plus facile de les nommer par but. i.e: public bool DisplayBasketValueInRed {get; ensemble; } J'utilise également (bien que probablement ne devrait pas) une classe générique pour réduire à quel point l'implémentation détaillée de INotifyPropertyChanged sur ces propriétés peut être. –

4

Pour la solution de Amsakanna je dû ajouter un nom de classe à l'Setter propriété:

< Setter Propriété = "TextBlock .Foreground" Value = "rouge" />

+0

moi aussi !. Merci! – tzippy

Questions connexes