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 :

XAML Binder le SelectedValue sur une concaténation de 2 propriétés


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut XAML Binder le SelectedValue sur une concaténation de 2 propriétés
    Bonjour,

    J'ai une classe Person

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Person
    {
        public string location;
        public string name;
        ...
    }
    J'ai une liste, constituée de Person

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<Person> list1 = new List<Person>()
    {
        new Person() { location = "Lyon", name = "Michel" },
        new Person() { location = "", name = "Mario" },
        new Person() { location = "Paris", name = "Michel" }
    };
    Dans un ComboBox, je veux afficher cette liste,sous la forme: nom (location). J'utilise donc un Converter...et jusqu'ici tout marche bien

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ComboBox ItemsSource="{Binding list1}" IsSynchronizedWithCurrentItem="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Converter={StaticResource concatNameAndLoc}}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    Code VB.NET : 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
    Public Class ConcatNameAndOption
        Implements IValueConverter
        Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
            Dim valConv As Person = TryCast(value, Person)
     
            Dim loc As String = valConv.Location
            If loc <> "" Then
                loc = " (" & loc & ")"
            End If
     
            Return valConv.Name & loc
        End Function
        Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
            Return value
        End Function
    End Class

    Je vois donc dans le ComboBox les données affichées correctement:
    Michel (Lyon)
    Mario
    Michel (Paris)
    Maintenant voila mon soucis:
    La personne sélectionnée est sauvée dans un fichier XML (<Person location="Paris">Michel</Person>) et je voudrais qu'au rechargement le ComboBox se place sur cette personne.
    ...que donc, la même concaténation appliquée à la personne "sauvée" soit retrouvée dans la liste concaténée de toutes les personnes
    Comment binder le SelectedValue? J'ai bien tenté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SelectedValue="{Binding Person, Converter={StaticResource concatNameAndOpt}, NotifyOnSourceUpdated=True}"
    ...mais qui ne débouche sur rien.

    Merci de m'avoir lu jusqu'ici...et de votre aide éventuelle, j'espère avoir été clair dans mon explication.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Tu n'as nullement besoin d'un converter .
    Tu peux faire ceci :
    code class Person revu:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ComponentModel;
     
    namespace WpfConcat
    {
        public class Person:INotifyPropertyChanged
        {
             private string _location;
            public string Location
            {
                get { return _location; }
                set { 
                    _location = value;
                    OnPropertyChanged("Location");
                }
            }
            public string _name;
            public string Name
            {
                get { return _concatNameAndOption; }
                set { 
                    _concatNameAndOption = value;
                    OnPropertyChanged("Name");
                }
            }
            public string _concatNameAndOption;
            public string ConcatNameAndOption
            {
                get {
     
                    if (Location  !="")
                          return Name + " (" + Location + ")";
                    else
                        return Name ;
                }
                set
                {
                    if (Location != "")
                        _concatNameAndOption= Name + " (" + Location + ")";
                    else
                        _concatNameAndOption = Name;
                    OnPropertyChanged("Name");
                }
            }
     
           public event PropertyChangedEventHandler  PropertyChanged;
           private void OnPropertyChanged(string nameProp)
           {
               PropertyChangedEventHandler h= PropertyChanged;
               if (h !=null)
                   h(this,new PropertyChangedEventArgs(nameProp));
           }
        }
    }
    il suffit de sauvegarder ton class Person en xml avec uniquement les 2 props Location et Name .
    Au chargement du xml tu crees ta liste Persons avec ces 2 props,la prop Concat est crée gratuitement par le class Person.
    Ensuite tu bindes le combo à cette prop .
    bon code.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    Mabrouki, un grand merci pour ta réponse! Combien de fois m'as tu aidé...je t'en remercie beaucoup!!

    Cela marche bien, dans le sens où cela s'affiche bien dans le ComboBox...et les valeurs sont bien sauvées distinctement dans le XML
    ...par contre, toujours pas moyen d'afficher la sélection sauvée au démarrage de l'application (par SelectedItem ou SelectedValue...là je t'avoue que je patauge (aussi ))

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ComboBox ItemsSource="{Binding list1}" SelectedValue="{Binding Person, NotifyOnSourceUpdated =True}" IsSynchronizedWithCurrentItem="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ConcatNameAndOption}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    @Mabrouki cette façon de faire en se passant d'un converter est top...mais pourrais-tu m'aider sur le SelectedValue (comment au démarrage le combobox peut se placer sur l'élément dont la concaténation des 2 propriétés match ce qui est sauvé)...qui est mon problème de départ!
    J'espère que tu en auras la possibilité et d'avance je te remercie

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/03/2016, 13h50
  2. Binder un SqlDataAdapter sur une listBox
    Par zouuc dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 01/12/2010, 10h18
  3. Erreur de segmentation sur une concaténation
    Par cypher.sephiroth dans le forum Débuter
    Réponses: 14
    Dernier message: 18/08/2009, 17h42
  4. Binder combo.ItemsSource sur une list<String>
    Par chris81 dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 18/02/2009, 15h57
  5. Parse error sur une concaténation
    Par alpking dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2006, 11h15

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