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 :

Ajouter des Triggers dynamiquement à une TextBox [Débutant(e)]


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut Ajouter des Triggers dynamiquement à une TextBox
    Bonjour,

    J'aimerais ajouter de manière dynamique un trigger sur chacune des TextBox de mon formulaire binder dynamiquement à une variable afin que le fond deviennent rouge si la valeur qu'elle contient dépasse une limite.

    Code :
    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
     
      TextBox l_OutputElement  = (TextBox)FindName(p_ElementToBind);
      Binding l_BindingTrigger    = new Binding();
      l_BindingTrigger.Mode       = BindingMode.OneWay;
      l_BindingTrigger.Source     = l_OutputVariable ;
      l_BindingTrigger.Path        = new PropertyPath("BeyondMaximum");
     
      DataTrigger l_ErrorTrigger  = new DataTrigger();
      l_ErrorTrigger.Binding        = l_BindingTrigger;
      l_ErrorTrigger.Value         = true;
     
      l_ErrorTrigger.Setters.Add(new Setter()
      {
          Property = TextBox.BackgroundProperty,
          Value = ColorConverter.ConvertFromString("Red")
       });
     
     
     l_OutputElement.Style = new Style(typeof(TextBox));
     l_OutputElement.Style.Triggers.Add(l_ErrorTrigger);
    Seulement au moment de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l_OutputElement.Style.Triggers.Add(l_ErrorTrigger);
    Une exception est levée. En cherchant dans les sous classes j'ai trouvé que l'exception correspond à :

    After a 'TriggerCollection' is in use (sealed), it cannot be modified.
    Comment faire pour déscellé la collection ou pour pouvoir ajouter un trigger dynamiquement ?

    Merci

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Edit : j'avais pas vu que tu cherchais à modifier un contrôle déjà instancié.

    Il faudrait que tu changes de style complètement au lieu de modifier l'existant

    Un truc du genre :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Style s = new System.Windows.Style();
    s.Setters.Add(new Setter()
    {
    	Property = TextBox.BackgroundProperty,
    	Value = new SolidColorBrush(Colors.Blue)
    });
     
    s.TargetType = typeof(TextBox);
    s.Triggers.Add(l_ErrorTrigger);
    l_OutputElement.Style = s;

    Désolé

    ps : pourquoi ne définit pas tes styles dans ton xaml directement ? c'est moins lourd je trouve

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Ne serait il pas plus pertinent d'implémenter le gestionnaire d'erreur fourni avec WPF ? http://msdn.microsoft.com/en-us/libr...v=vs.100).aspx

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Avant tout merci de vos réponses

    Citation Envoyé par koyot3 Voir le message
    ps : pourquoi ne définit pas tes styles dans ton xaml directement ? c'est moins lourd je trouve
    Je dispose d'un ensemble de TextBox dans une grid.
    Chacune d'entre elles est bindée dynamiquement sur une instance de type "OutputVariable" qui représente le résultat d'un calcul.

    Parmi leurs propriétés, on trouve une "value" et un "maximum".

    De plus chaque instance est paramétrée via un fichier xml qui est chargé au début de l'application. Ce fichier sera maintenu par une tierce personne sans compétence en programmation.

    Ce que je veux faire c'est colorier les contours de la textbox en rouge si jamais "Value > Maximum".

    J'ai déjà essayé de créer un Style pour cela en me basant sur des tutoriels. Seulement cela ne fonctionne pas car :

    1) Je n'ai pas trouvé de moyen de définir un style selon un prédicat "Value > Maximum".

    2 ) Généralement quand je lis des tutoriels, on bind la TextBox.value sur une propriété (ici MyVarInstance.Value) et on dit que le style s'active si la value vaut X.
    Sauf que je n'ai pas de X avant d'avoir lancé l'application et instancié mes "OuputVariables". De plus X représente une plage de valeur et non pas une unique valeur.

    3) 90% des tutoriel que j'ai lu, on soit :
    - Des variables directement crées dans le wpf avec des valeurs figées et donc qui ne s'adapte que très peu à quelque chose de dynamique
    - Soit utilise un data context sur le layout englobant (mon grid) mais j'ai un grand nombre de textbox dans mon grid. Je ne crois pas qu'on puisse setter plusieurs Data Context en même temps.

    4) Et sûrement le plus important : Je débute en C# et WPF (je suis plus habitué à QT et au c++).

    Au final vu mes déboires, je me dis que je n'ai pas utilisé la bonne philosophie de développement mais là j'ai plus réellement le temps de recommencé. J'aurais p-e dû me pencher sur le pattern MVVM.


    Citation Envoyé par Nathanael Marchand Voir le message
    Ne serait il pas plus pertinent d'implémenter le gestionnaire d'erreur fourni avec WPF ? http://msdn.microsoft.com/en-us/libr...v=vs.100).aspx
    Grace à tes informations j'ai tenté d'utiliser l'interface IDataError (via http://codeblitz.wordpress.com/2009/...dataerrorinfo/) mais à cause du binding dynamique que j'effectue, les méthodes d'IDataError liées à l'interface ne sont jamais appelées.

Discussions similaires

  1. [SP-2007] Ajout des lien dynamique dans une liste déroulante
    Par nouvintou dans le forum SharePoint
    Réponses: 2
    Dernier message: 15/03/2011, 11h31
  2. [SP-2007] Ajouter des champs dynamiquement dans une cutom list
    Par takuan64 dans le forum SharePoint
    Réponses: 8
    Dernier message: 26/07/2010, 14h12
  3. Ajouter des caractéres dans une textbox
    Par l3xki dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/02/2008, 14h18
  4. ajouter un champ dynamiquement à une instance de table
    Par maniack dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/02/2004, 23h58
  5. Réponses: 5
    Dernier message: 13/11/2003, 16h57

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