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 :

Factorisation de 2 DataTrigger faisant la même chose mais bindés sur des variables différentes


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Par défaut Factorisation de 2 DataTrigger faisant la même chose mais bindés sur des variables différentes
    Bonjour,

    J'ai une question sur WPF, plus particulièrement sur les DataTrigger.
    J'aurais voulu savoir s'il existe un moyen de les factoriser.
    Je m'explique :

    J'ai un premier TextBlock :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <TextBlock Text="{Binding Nom}">
                                <TextBlock.Style> 
                                    <Style>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Booleen1}" Value="True">
                                                <Setter Property="TextBlock.Foreground" Value="Black" />
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding Booleen1}" Value="False">
                                                <Setter Property="TextBlock.Foreground" Value="Red" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>
    J'ai un second TextBlock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <TextBlock Text="{Binding Prenom}">
                                <TextBlock.Style> 
                                    <Style>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Booleen2}" Value="True">
                                                <Setter Property="TextBlock.Foreground" Value="Black" />
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding Booleen2}" Value="False">
                                                <Setter Property="TextBlock.Foreground" Value="Red" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>
    Les DataTrigger font la même chose : le texte est noir quand le booléen vaut vrai et rouge quand il vaut faux.
    La seule différence entre les deux c'est qu'ils ne se bindent pas sur le même booléen (Booleen1 et Booleen2).
    Existe-t-il un moyen quelconque de "factoriser" pour ne créer qu'un DataTrigger et dans chaque style de TextBlock, on n'aurait qu'à spécifier sur quel booléen se binder?

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 77
    Par défaut
    Tu peux sortir le style et le mettre dans les ressources de la fenetre ou du UserControl et ensuite tes Texblock utiliseront ce styles tous les deux.

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Par défaut
    Ok pour mettre le style dans les ressources du UserControl. Mais ensuite comment tu fais pour spécifier la variable sur laquelle se binder dans chaque TextBlock?
    Tu pourrais me donner un exemple?
    Merci.

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Par défaut
    Si j'étais toi, j'essaierais de faire le style dans les ressources, le Binding, tu le fais sur "." ( {Binding . } ), et quand tu set ton style sur ta TextBox, tu lui changes son Datacontext pour la variable booléenne qui doit être checkée.

    Edit: mais je raconte n'improte quoi, ça ne marcheras pas. Pas assez de sommeil, désolé

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Une solution possible: tu fais un style et après, tu créés un DataTrigger custom qui prend en paramètre 2 binding. Si le premier binding échoue, tu chopes la valeur du 2ème et vice-versa

  6. #6
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Salut,

    Voici une solution où tu passes par le Tag du TextBlock.
    Dans ton cas, il te suffit de binder ton booléen sur le Tag.

    Code : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Page.Resources>
    <Style TargetType="{x:Type TextBlock}">
    <Style.Triggers>
    <DataTrigger Binding="{Binding Path=Tag, RelativeSource={x:Static RelativeSource.Self}}" Value="True">
    <Setter Property="TextBlock.Foreground" Value="Green" />
    </DataTrigger>
    <DataTrigger Binding="{Binding Path=Tag, RelativeSource={x:Static RelativeSource.Self}}" Value="False">
    <Setter Property="TextBlock.Foreground" Value="Red" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </Page.Resources>
    <StackPanel> 
    <TextBlock>
    <TextBlock.Tag>
    <sys:Boolean>True</sys:Boolean>
    </TextBlock.Tag>
    Text Vrai</TextBlock>
    <TextBlock>
    <TextBlock.Tag>
    <sys:Boolean>False</sys:Boolean>
    </TextBlock.Tag>
    Text Faux</TextBlock>
    </StackPanel>
    </Page>
    

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Par défaut
    Merci à tous pour vos réponses.
    J'ai adopté l'astuce de Thrud finallement, ca marche nickel.
    Merci !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/08/2011, 17h53
  2. Réponses: 22
    Dernier message: 10/07/2011, 17h49
  3. Réponses: 1
    Dernier message: 02/06/2011, 15h22
  4. Plusieurs fonctions faisant la même chose
    Par supertoms dans le forum VBA Access
    Réponses: 7
    Dernier message: 05/05/2008, 11h30
  5. Réponses: 4
    Dernier message: 19/04/2007, 15h36

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