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 :

Affichage de données différent en fonction de la sélection d'une ComboBox


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut Affichage de données différent en fonction de la sélection d'une ComboBox
    Bonjour,

    J'aimerai avoir des conseils sur la meilleure manière de faire la chose suivante :

    - J'ai un TextBlock affichant une valeur numérique (valeur numérique qui est contenue dans une variable membre de ma classe).
    - J'ai une ComboBox contenant comme valeurs des types de représentation pour les valeurs numériques (normal, scientifique, binaire, hexadécimal, etc)
    - J'aimerai que la valeur du TextBlock soit affichée avec la notation sélectionnée dans la ComboBox.

    Comment puis-je réaliser ceci le plus proprement possible ?
    Au départ je pensais pouvoir utiliser les Converter, mais je ne sais pas comment faire le lien entre le TextBlock et la ComboBox.
    Dois-je utiliser un Template ?
    Y'a d'autres solutions ?

    Merci d'avance.

  2. #2
    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
    Je vois bien une solution mais c'est pas propre: tu peux t'abonner à l'évent KeyPress de la TextBox et formater son contenu en fonction de la Combox.

  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 : 44
    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
    Tu dois pouvoir faire ça en utilisant un DataTemplateSelector, qui renverrait tel ou tel DataTemplate selon la sélection du ComboBox

  4. #4
    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
    J'y avais pensé aussi mais le pb, c'est que le DataTemplateSelector, il va l'appliquer à la Combo or lui, c'est la TextBox qu'il veut formater...

  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 : 44
    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 Thomas Lebrun Voir le message
    J'y avais pensé aussi mais le pb, c'est que le DataTemplateSelector, il va l'appliquer à la Combo or lui, c'est la TextBox qu'il veut formater...
    Non, c'est pas à la combo qu'il faut l'appliquer, mais à un ContentPresenter (via la propriété ContentTemplateSelector). A la place de la TextBox, tu mets un ContentPresenter, et tu définis autant de DataTemplates qu'il y a de formats d'affichage. Pas très "dynamique", mais bon...
    Remarque, en étant bourrin on pourrait même envisager de générer dynamiquement le template dans le DataTemplateSelector

    EDIT: En fait, y a un moyen encore mieux, sans DataTemplateSelector : mettre la liste des DataTemplates directement dans la combobox, et binder le ContentTemplate du ContentPresenter directement sur le SelectedItem.
    Le seul problème c'est qu'un DataTemplate n'a pas de nom, donc il faut faire un petit wrapper pour l'affichage :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class NamedItem
    {
        public string Name { get; set; }
        public object Item { get; set; }
    }
    Dans le XAML :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ComboBox Name="cmbTemplates" DisplayMemberPath="Name"/>
    <ContentPresenter ContentTemplate="{Binding SelectedItem.Item, ElementName = cmbTemplates}" Content="1234.5"/>
    Et on définit "manuellement" le contenu de la ComboBox :
    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
    16
    17
    18
    19
    20
    21
    22
    23
                List<NamedItem> templates = new List<NamedItem>();
                templates.Add(new NamedItem
                {
                    Name = "Normal",
                    Item = FindResource("tplNormal")
                });
                templates.Add(new NamedItem
                {
                    Name = "Scientific",
                    Item = FindResource("tplScientific")
                });
                templates.Add(new NamedItem
                {
                    Name = "Binary",
                    Item = FindResource("tplBinary")
                });
                templates.Add(new NamedItem
                {
                    Name = "Hexadecimal",
                    Item = FindResource("tplHexadecimal")
                });
                cmbTemplates.ItemsSource = templates;
                cmbTemplates.SelectedIndex = 0;

    Testé et validé

  6. #6
    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
    Citation Envoyé par tomlev Voir le message
    Non, c'est pas à la combo qu'il faut l'appliquer, mais à un ContentPresenter (via la propriété ContentTemplateSelector). A la place de la TextBox, tu mets un ContentPresenter, et tu définis autant de DataTemplates qu'il y a de formats d'affichage.
    En fait, c'est sur les ContentControl que l'on peut utiliser la propriété ContentTemplateSelector. Si on prent un ContentControl/ContentPresenter, cela peut effectivement fonctionner mais dans ce cas, il faudra redéfinir son Template pour le faire coïncider avec celui de la TextBox... Certes, cela peut fonctionner mais c'est un peu réinventer la roue...

    EDIT: En fait, y a un moyen encore mieux, sans DataTemplateSelector : mettre la liste des DataTemplates directement dans la combobox, et binder le ContentTemplate du ContentPresenter directement sur le SelectedItem.
    Bonne idée dis donc

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

Discussions similaires

  1. affichage des données provenant d'un web service soap dans une listview
    Par nagca dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 04/07/2011, 17h11
  2. Réponses: 0
    Dernier message: 14/11/2010, 13h14
  3. Réponses: 1
    Dernier message: 06/03/2010, 01h11
  4. Réponses: 4
    Dernier message: 12/12/2008, 07h28
  5. Réponses: 3
    Dernier message: 19/12/2005, 13h51

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