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 :

double binding sur combobox >>> possible?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut double binding sur combobox >>> possible?
    bonjour a tous,

    J'ai un gros soucis de gestion de binding sur une combobox. voici un bref aperçu de mon soucis:

    - d'un coté j'ai un dataset qui contient une table de ma DB avec differents champ:
    > Nom
    > Prenom
    > Sexe

    -de l'autre coté j'ai ma combobox qui dois permettre la visualisation/modification du Champ "sexe"

    Dans ma combobox je ne dois avoir que deux items ("Homme","Femme"). Je cherche a faire un binding afin qu'en fonction de l'enregistrement selectionné, que l'item séléctionné de la combobox soit le même que la valeur du champ "Sexe".
    Je n'y arrive pas.

    J'ai testé un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <ComboBox
                IsSynchronizedWithCurrentItem="True" 
                ItemsSource="{Binding}"
                DisplayMemberPath="Sexe"
                Margin="0,0,164,154"
    Mais dans ce cas dans le combobox j'ai autant d'éléments que d'enregistrements dans ma base.

    Donc comment faire pour n'avoir que deux items dans la combobox ("Homme","Femme") et que le bon soit sélectionné en fonction du numero d'enregistrement de la base de donnée?

    merci pour votre aide car la je bloque completement (pour info je debute en WPF donc soyez indulgent)

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 81
    Points : 136
    Points
    136
    Par défaut
    Je ferai un binding de ItemsSource sur une liste des sexes chargés depuis ta BD ou alors un binding sur une énumération.

    Et ton SelectedItem bindé sur la propriété Sexe de ton objet.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut,

    merci pour ta réponse. C'est ce que j'ai essayé de faire.

    J'ai essayé de binder une enumeration sur la propriété Itemsource de la combobox.
    et un second binding de mon dataset sur la propriété Itemselected.... Mais le soucis c'est que je n'y arrive pas (faut dire que je debute en wpf)

    aurais tu un petit exemple fonctionnel a me fournir?

    merci

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Tu as ce post qui explique comment binder un enum à une comboBox.
    http://www.developpez.net/forums/d76...bobox-enumere/

    Si t'as un soucis pour l'appliquer, dis le

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    bon, je dois être une cruche car je n'y arrive pas

    J'ai declaré mon enum de cette façon:

    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
     
    namespace AuCBmaker
    {
        /// <summary>
        /// Logique d'interaction pour frmParam.xaml
        /// </summary>
        /// 
     
        public partial class frmParam : Page
        {
     
            private BASE.DBDataSet.ParamDBDataTable ParamDB;
            private CollectionView dataView;
     
            public enum Flx
            {
                _15ml= 0,
                _30ml= 1,
                _60ml= 2
            }
     
            internal CollectionView DataView
            {
                get
                {
                    if (dataView == null)
                    {
                        dataView = (CollectionView)
                            CollectionViewSource.GetDefaultView(
                            this.DataContext);
                    }
                    return dataView;
                }
            }
     
            public frmParam()
            {
                InitializeComponent();
     
                ParamDBTableAdapter customersTableAdapter = new ParamDBTableAdapter();
                ParamDB = customersTableAdapter.GetData();
                this.DataContext = ParamDB; 
             }    
        }
     
    }
    dans la partie xaml de ma page, j'ai ça:
    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
     
    <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="AuCBmaker.frmParam"
        Title="frmParam" Width="700" Height="500" Background="#FF9CAEEC" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
     
     
    <Page.Resources>
            <ObjectDataProvider x:Key="flacon" MethodName="Flx" ObjectType="{x:Type sys:Enum}">
    </Page.Resources>
     
        <Grid d:IsLocked="True">               
            <ListBox
                IsSynchronizedWithCurrentItem="True" 
                ItemsSource="{Binding}" 
                DisplayMemberPath="Param_ParamDB"  
                Name="ParamListbox" 
                HorizontalAlignment="Left" 
                Margin="35,96,0,140" 
                Width="266"
            />
     
    <ComboBox ItemsSource="{Binding Source={StaticResource flacon}}" />
    la j'ai une erreur:
    le type Enum est introuvable
    ..... c'est du a quoi?

    sinon pour le deuxieme binding sur mon dataset, je dois mettre quoi pour qu'en fonction de l'element selectionné dans la listbox, la selection de l'item de la combobox soit le bon?, un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <ComboBox 
    ItemsSource="{Binding Source={StaticResource flacon}}" 
    SelectedItem="{Binding Path=VR1_ParamDB}"
    />
    ps: pour info la table "ParamDB" de ma base mdb, contient les champs:
    -Param_ParamDB (bindé sur la listbox)
    -VR1_ParamDB (que je cherche a binder sur le selectedItem de la combobox)

    voila, j'espere avoir été assez clair.... mais c loin d'être sur

    en tout cas merci pour votre aide,

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    L'erreur que tu a sur l'enum veut dire que tu as oublié de définir le Namespace :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Page ...
      xmlns:sys="clr-namespace:System;assembly=mscorlib" >

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    bonjour Binoo,

    merci pour ton aide, en effet je n'ai plus l'erreur sur l'enum.... par contre ma combobox reste désespérément vide

    voici mon code xaml:
    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
     
    <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     
        x:Class="AuCBmaker.frmParam"
        Title="frmParam" Width="700" Height="500" Background="#FF9CAEEC" mc:Ignorable="d">
     
        <Page.Resources>
            <ObjectDataProvider x:Key="flacon" MethodName="Flx" ObjectType="{x:Type sys:Enum}"/>
        </Page.Resources>
     
     
        <Grid d:IsLocked="True">               
            <ListBox
                IsSynchronizedWithCurrentItem="True" 
                ItemsSource="{Binding}" 
                DisplayMemberPath="Param_ParamDB"  
                Name="ParamListbox" 
                HorizontalAlignment="Left" 
                Margin="35,96,0,140" 
                Width="266"
            />
     
            <ComboBox
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding Source={StaticResource flacon}}"
                SelectedItem="{Binding VR1_ParamDB}"
                Margin="0,0,164,154"
                HorizontalAlignment="Right" 
                VerticalAlignment="Bottom"
                Width="73" 
                Height="25" 
                d:IsLocked="True"
                />
    et le code C#:
    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
    58
    59
    60
    61
    62
    63
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Data;
    using System.Data.OleDb;
    using AuCBmaker.BASE.DBDataSetTableAdapters;
     
    namespace AuCBmaker
    {
        /// <summary>
        /// Logique d'interaction pour frmParam.xaml
        /// </summary>
        /// 
     
        public partial class frmParam : Page
        {
     
            private BASE.DBDataSet.ParamDBDataTable ParamDB;
            private CollectionView dataView;
     
            public enum Flx
            {
                test1 = 0,
                test2 = 1,
                test3 = 2
            }
     
            internal CollectionView DataView
            {
                get
                {
                    if (dataView == null)
                    {
                        dataView = (CollectionView)
                            CollectionViewSource.GetDefaultView(
                            this.DataContext);
                    }
                    return dataView;
                }
            }
     
            public frmParam()
            {
                InitializeComponent();
     
                ParamDBTableAdapter customersTableAdapter = new ParamDBTableAdapter();
                ParamDB = customersTableAdapter.GetData();
                this.DataContext = ParamDB; 
             }    
        }
     
    }
    pourquoi cette connerie de combobox reste vide? je fais quoi de travers?

    merci

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Il faut comme dans le post que je t'ai donné en lien définir ton enum de cette manière :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      <ObjectDataProvider x:Key="flacon" MethodName="GetValues" ObjectType="{x:Type sys:Enum}" >
        <ObjectDataProvider.MethodParameters>
          <x:Type TypeName="AuCB:Flx" />
        </ObjectDataProvider.MethodParameters>
      </ObjectDataProvider>

    où AuCB est le namespace de ton enum que tu auras défini de la même manière que pour le namespace System :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Page ...
      xmlns:AuCB="clr-namespace:NamespaceEnum" >
    nb: tu devrais obtenir la syntaxe exacte du Namespace à l'aide de l'intellisense


    En espérant que ça marche

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    c'est bon pour l'affichage de l'enum dans la combobox...

    je me suis pris la tête pendant une heure (type Flx non trouvable) car j'avais définit mon enum Flx au mauvais endroit.

    Par contre pour ce qui est de selectionner le bon item de la combobox en fonction de l'element sélectionné dans la listbox, ça ne focntionne pas ma methode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <ComboBox
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding Source={StaticResource flacon}}"
                SelectedItem="{Binding VR1_ParamDB}"
    une petite idée?

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Là je sèche un peu (après il y a peut-être un truc qui m'échappe).

    J'ai vu quelques post similaires où ils résolvaient ça à coup de recompilation... Donc essaie toujours un clean de ta solution et regénère la dès fois que ...

    http://social.msdn.microsoft.com/For...c-bec271674d5c

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    c'est bon j'ai trouvé pour le binding de l'enum... ton exemple était bon, c'est moi qui est merdouillé

    par contre le deuxieme binding ne fonctionne pas (voir mon précédent message édité)

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Ok, et en enlevant :
    IsSynchronizedWithCurrentItem="True"

    Sinon que vaut VR1_ParamDB (0, 1, 2 ou alors test1, test2, test3)

    Pour info, sur un enum tu as les méthodes GetValues et GetNames. Qui retourne respectivement un tableau d'entier (soit 0,1,2) et un tableau de string (soit "test1", "test2", "test3").

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    ben en fait dans la base de donnée au niveau du champ "VR1_ParamDB", il va y avoir des valeur (0 ou 1 ou 2) en fonction de l'enregistrement.

    Je veux afficher dans la combobox, l'element correspondant. Par exemple si pour l'enregistrement selectionné dans la listbox, la valeur du champ "VR1_ParamDB" vaut 1, je veux selectionner l'element "test2" de la combobox.

  14. #14
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 81
    Points : 136
    Points
    136
    Par défaut
    Essaie de passer par un Converter qui prendra ta valeur "brut" (ie 0,1 ou 2) et te renverra le membre correspondant de ton énumération.

    En gros, tu déclares une classe BDValueToEnumConverter (par exemple) qui implémente l'interface IValueConverter et dans la méthode Convert tu fais le petit traitement de conversion.

    Dans ton XAML, tu déclares ton converter dans ton ResourceDictionnary, et tu l'appelles au niveau de ton Binding.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    y a pas moyen de faire qqchose d'equivalent directement en xaml avec la proriete SelectedItem de la combobobx?

  16. #16
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 81
    Points : 136
    Points
    136
    Par défaut
    Tu peux peut être essayer de binder le SelectedIndex de ta combo plutot que le selectedItem.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    oui je vais tester cela des que j'ai un peu de temps.

    sinon j'ai vu qu'il été apparement aussi possible d'utiliser un dictionary à la place de l'enum. Quel est le plus avantageux? le plus facile a binder?

Discussions similaires

  1. Double binding sur objet complex
    Par babass77 dans le forum Flex
    Réponses: 5
    Dernier message: 29/04/2011, 10h08
  2. Binding sur combobox
    Par NejNej dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 15/03/2011, 15h08
  3. Binding sur une combobox
    Par duaner dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/08/2009, 15h48
  4. [Spring MVC] <spring:bind sur combobox
    Par coyote999 dans le forum Spring Web
    Réponses: 2
    Dernier message: 28/02/2008, 14h32

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