IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[WPF] Changer le style si la valeur est null ou vide.


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut [WPF] Changer le style si la valeur est null ou vide.
    Bonjour à tous,

    Je bute sur un petit problème au niveau des styles.
    J'ai un textblock qui est bindé à une propriété d'un objet. Celle ci peut être "null".
    Je voudrais afficher un texte par défaut et modifier le style de celui ci quand celle ci est "null" ou alors quand la string est vide.
    J'ai essayé de faire ceci:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <TextBlock Text="{Binding Path=Adresse, Mode=OneWay}">
    	<TextBlock.Style>
    		<Style>
    			<Style.Triggers>
    				<DataTrigger Binding="{Binding Path=Adresse, Mode=OneWay}" Value="">
    				   <Setter Property="TextBlock.Foreground" Value="#666666"/>
    				   <Setter Property="TextBlock.FontStyle" Value="Italic" />
    				   <Setter Property="TextBlock.Text" Value="Non renseigné" />
    				</DataTrigger>
    				<DataTrigger Binding="{Binding Path=Adresse, Mode=OneWay}" Value="{x:Null}">
    				   <Setter Property="TextBlock.Foreground" Value="#666666"/>
    				   <Setter Property="TextBlock.FontStyle" Value="Italic" />
    				   <Setter Property="TextBlock.Text" Value="Non renseigné" />
    				</DataTrigger>
    			</Style.Triggers>
    		</Style>
    	</TextBlock.Style>
    </TextBlock>

    Hors je n'ai jamais le texte "Non renseigné" qui apparait alors que les valeurs sont bien à "null".
    La preuve si je fait {Binding Path=Adresse, Mode=OneWay, TargetNullValue=Empty}, j'ai la propriété "Text" qui affiche "Empty" et qui prend le style défini dans le DataTrigger.
    1) Pourtant le Text en question n'est plus null puisque il est à "Empty", il ne devrait donc pas prendre le style si?
    2) Comment se fait il que je ne puisse pas modifier le texte via le DataTrigger, parceque je suis bindé sur cette propriété?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Salut
    Si je ne me trempe pas les DataTriggers ne marchent que dans un DataTemplate. Dans un style tu ne peux utiliser que des Triggers sur la propriété de ton Control. C'est logique car un Control est sensé être indépendant de son DataContext.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par goast Voir le message
    Si je ne me trempe pas les DataTriggers ne marchent que dans un DataTemplate. Dans un style tu ne peux utiliser que des Triggers sur la propriété de ton Control. C'est logique car un Control est sensé être indépendant de son DataContext.
    Non, on peut tout à fait utiliser des DataTriggers dans les triggers d'un style, je le fais souvent...

    Citation Envoyé par takinelinfo Voir le message
    1) Pourtant le Text en question n'est plus null puisque il est à "Empty", il ne devrait donc pas prendre le style si?
    Tu n'utilises pas le même binding pour la propriété Text et pour le DataTrigger, le DataTrigger ne voit donc pas la valeur "Empty" mais la valeur originale de Address

    Donc il te suffit de faire ça :

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <TextBlock Text="{Binding Path=Adresse, Mode=OneWay, TargetNullValue='Non renseigné'}">
    	<TextBlock.Style>
    		<Style>
    			<Style.Triggers>
    				<DataTrigger Binding="{Binding Path=Adresse, Mode=OneWay}" Value="">
    				   <Setter Property="TextBlock.Foreground" Value="#666666"/>
    				   <Setter Property="TextBlock.FontStyle" Value="Italic" />
    				</DataTrigger>
    				<DataTrigger Binding="{Binding Path=Adresse, Mode=OneWay}" Value="{x:Null}">
    				   <Setter Property="TextBlock.Foreground" Value="#666666"/>
    				   <Setter Property="TextBlock.FontStyle" Value="Italic" />
    				</DataTrigger>
    			</Style.Triggers>
    		</Style>
    	</TextBlock.Style>
    </TextBlock>

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut
    Nickel ça fonctionne.
    Par contre petite question. Suis je obligé de le reécrire pour toutes les Textblock ou est ce que je peux mettre un nom à mo, style est le réutiliser?

    Ce qui risque de me poser problème c'est cette ligne:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <DataTrigger Binding="{Binding Path=Adresse, Mode=OneWay}" Value="{x:Null}">
    car ça ne sera pas à chaque fois Adresse que je voudrais bindé.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Effectivement c'est pas évident à refactoriser... cela dit, tu peux "tricher" un peu

    En gros, tu crées une propriété attachée que tu bindes sur l'adresse (ou autre chose), et dans le style, tu vérifies cette propriété.

    Propriété attachée

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public static class BindingHelper
        {
            public static object GetValue(DependencyObject obj)
            {
                return (object)obj.GetValue(ValueProperty);
            }
     
            public static void SetValue(DependencyObject obj, object value)
            {
                obj.SetValue(ValueProperty, value);
            }
     
            public static readonly DependencyProperty ValueProperty =
                DependencyProperty.RegisterAttached("Value", typeof(object), typeof(BindingHelper), new UIPropertyMetadata(null));
        }

    XAML

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <Style x:Key="ItalicWhenValueEmpty" TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="local:BindingHelper.Value" Value="">
               <Setter Property="TextBlock.Foreground" Value="#666666"/>
               <Setter Property="TextBlock.FontStyle" Value="Italic" />
            </Trigger>
            <Trigger Property="local:BindingHelper.Value" Value="{x:Null}">
               <Setter Property="TextBlock.Foreground" Value="#666666"/>
               <Setter Property="TextBlock.FontStyle" Value="Italic" />
            </Trigger>
        </Style.Triggers>
    </Style>
     
    ...
     
    <TextBlock Text="{Binding Path=Adresse, Mode=OneWay, TargetNullValue='Non renseigné'}"
               local:BindingHelper.Value="{Binding Path=Adresse}"
               Style="{StaticResource ItalicWhenValueEmpty}">

    Sinon, j'ai proposé une solution qui correspond à l'approche que tu as adoptée, mais on pourrait aussi faire ça autrement... il y a plein de contrôles de type "InfoTextBox", qui affichent un texte en "filigrane" quand la TextBox est vide. La librairie Dvp.NET propose une solution de ce type, mais sous forme de propriété attachée :

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <TextBlock Text="{Binding Path=Adresse, Mode=OneWay}"
               dvp:TextBoxBehavior.InfoText="Non renseigné">

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. plantage quand une valeur est nulle dans une requete
    Par vinze60 dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 29/04/2013, 21h55
  2. [JFormattedTextField] Vérifier si la valeur est nulle
    Par gids01 dans le forum Composants
    Réponses: 2
    Dernier message: 23/12/2008, 16h43
  3. Comment vérifier qu'une valeur est NULL ?
    Par innova dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/11/2006, 14h53
  4. [VB.Net] Afficher des données dont la valeur est nulle
    Par badnane2 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/06/2006, 13h23
  5. Calcul Stock Actuel mm lorsqu'une valeur est null
    Par priest69 dans le forum Access
    Réponses: 3
    Dernier message: 12/09/2005, 18h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo