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 :

DataGrid & ComboBox


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par défaut DataGrid & ComboBox
    Bonjour à tous,

    J'ai un sacré souci sur lequel je tourne depuis pas mal de temps.

    Soit un objet Article possédant un nom, un prénom, un dépôt.
    Un dépôt est composé d'un id et d'un intitulé

    Si j'affiche dans une combobox standard un observablecollection<Depot> et que je souhaite récupérer le dépôt courant en passant par le selecteditem, ça fonctionne sans problème.

    Maintenant si j'effectue la même opération dans un datagrid, ça ne fonctionne absolument pas.

    J'ai fais plusieurs test pour en arriver à ce résultat qui ne fonctionne pas :

    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
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    public class ArticleViewModel : ViewModelBase
    {
     
            #region Members Fields
            private String m_Ref;
     
            private String m_Libelle;
     
            private ObservableCollection<Depot> m_ObservableDepot;
     
            private Depot m_CurrentDepot
            #endregion
     
            #region Properties
              public String Ref
            {
                get 
                { 
                    return m_Ref; 
                }
                set 
                {
                    this.m_Ref = value; 
                    this.OnPropertyChanged("Ref"); 
                }
            }
     
            public String Libelle
            {
                get 
                { 
                    return m_Libelle; 
                }
                set 
                {
                    this.m_Libelle = value; 
                    this.OnPropertyChanged("Libelle"); 
                }
            }
     
            public ObservableCollection<Depot> ObservableDepot
            {
                get
                {
                    return this.m_ObservableDepot;
                }
                set
                {
                    this.m_ObservableeDepot = value;
                    this.OnPropertyChanged("ObservableDepot");
                }
            }
     
            public Depot CurrentDepot
            {
                get
                {
                    return this.m_CurrentDepot;
                }
                set
                {
                    this.m_CurrentDepot = value;
                    this.OnPropertyChanged("CurrentDepot");
                }
            }
            #endregion
     
     
           #region Constructors
            public ArticleViewModel()
            {
                  Model.Local.DepotRepository DepotRepository = new Model.Local.DepotRepository;
     
                  this.ObservableDepot = DepotRepository.List();
             }
            #endregion
    }

    Maintenant dans ma view nommé SaisieView, j'ai :

    Code xaml : 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
     
    <DataGrid RowHeight="30" ItemsSource="{Binding ObservableArticle}" SelectedItem="{Binding CurrentArticle}" Margin="8,8,8,40" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" SelectionMode="Single"  GridLinesVisibility="None" HeadersVisibility="Column">
    					<DataGrid.Columns>
    						<DataGridTextColumn Header="Ref" Width=".10*" Binding="{Binding Ref}" IsReadOnly="True" />
    						<DataGridTextColumn Header="Libellé court" Width=".10*" Binding="{Binding Libelle}" IsReadOnly="True" />
    						<DataGridTemplateColumn Header="Dépôt" Width=".10*" IsReadOnly="False">
    							<DataGridTemplateColumn.CellTemplate >
    								<DataTemplate>
    									<ComboBox ItemsSource="{Binding ObservableDepot}" SelectedItem="{Binding CurrentDepot}" DisplayMemberPath="DE_Intitule"/>
    								</DataTemplate>
    							</DataGridTemplateColumn.CellTemplate>
    						</DataGridTemplateColumn>
    						<DataGridTemplateColumn Header="DateLivr" Width=".10*">
    							<DataGridTemplateColumn.CellTemplate >
    								<DataTemplate>
    									<DatePicker SelectedDate="{Binding DateLivraison}"/>
    								</DataTemplate>
    							</DataGridTemplateColumn.CellTemplate>
    						</DataGridTemplateColumn>
    					</DataGrid.Columns>
    				</DataGrid>

    Et dans mon SaisieViewModel j'ai une ObservableCollection<Article> qui me récupère mes articles et les affiches dans mon datagrid (via ObservableArticle). Tout celà fonctionne bien, j'ai bien ma liste d'articles, je récupère bien le current article, j'ai ma liste de dépôt disponible dans ma combobox mais le selecteditem de ma combobox ne fonctionne pas.
    J'ai lu sur le net qu'il y avait un problème et qu'une combobox dans un datagrid n'est pas identique à une combobox seule. La solution conseillé était que le selecteditem ne fonctionnait pas s'il était bindé sur un objet dans le cas d'une combobox dans un datagrid. J'ai donc essayé de l'associé à un Int, un String, mais rien n'y fait.

    Je ne comprend tout simplement pas le problème ^^.

    Merci d'avance à ceux qui se pencheront sur le sujet.

  2. #2
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Salut,

    Essaye en ajoutant un SelectedValue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SelectedValue="{Binding CurrentDepot.ID}" SelectedValuePath="ID"

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par défaut
    Citation Envoyé par yonpo Voir le message
    Salut,

    Essaye en ajoutant un SelectedValue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SelectedValue="{Binding CurrentDepot.ID}" SelectedValuePath="ID"
    Salut,

    Je viens de tester, ça ne passe pas.
    J'ai mis un point d'arrêt sur le setter de CurrentDepot, je ne rentre pas dedans.
    Et quand je récupère mon ObservableArticle, mon CurrentDepot.DE_No (mon id) n'est pas setté non plus.

    Je ne comprend vraiment pas, c'est comme si le SelectedItem et le SelectedValue ne se binder pas correctement sur mon CurrentDepot.
    Pourtant CurrentDepot est bien un attribut public de mon objet article (le private est bon, le onpropertychanged aussi, et ça fonctionne si je met ma combobox en dehors de mon datagrid).
    Bref, je ne comprend pas du tout. Mais merci quand même ^^

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par défaut
    Salut,

    Bon finalement j'ai trouvé grâce à ce post :
    http://msdn.microsoft.com/fr-fr/magazine/gg983481.aspx

    L'idée est que le problème ne vient pas de la combobox mais de tout éléments qui n'est pas éditable par défaut dans un datagrid.
    Dans un datagrid, une combobox n'est pas un élement éditable, au même titre qu'un datepicker, une listebox etc...
    Il faut donc travailler sur le CellEditingTemplace du DatagridTemplate.Column afin de forcer l'édition de l'item en question et permettre donc le binding vers l'objet.

    Exemple :
    Code xaml : 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
     
    <DataGridTemplateColumn Header="Dépôt" Width=".15*" IsReadOnly="False">
    							<DataGridTemplateColumn.CellTemplate >
    								<DataTemplate>
                                       <TextBlock Text="{Binding CurrentArticleDepot.DE_Intitule}" />
    								</DataTemplate>
    							</DataGridTemplateColumn.CellTemplate>
    							<DataGridTemplateColumn.CellEditingTemplate>
    								<DataTemplate>
    									 <ComboBox Margin="4,4,4,4" ItemsSource="{Binding ObservableArticleDepot}" SelectedValue="{Binding CurrentArticleDepot, Mode=TwoWay}" DisplayMemberPath="DE_Intitule" />
    								</DataTemplate>
    							</DataGridTemplateColumn.CellEditingTemplate>
    						</DataGridTemplateColumn>
    						<DataGridTemplateColumn Header="DateLivr" Width=".10*">
    							<DataGridTemplateColumn.CellTemplate >
    								<DataTemplate>
    									 <TextBlock Text="{Binding DateLivraison, StringFormat=\{0:d\}, ConverterCulture=fr}" />
    								</DataTemplate>
    							</DataGridTemplateColumn.CellTemplate>
    							<DataGridTemplateColumn.CellEditingTemplate>
    								<DataTemplate>
    									<DatePicker SelectedDate="{Binding DateLivraison, Mode=TwoWay}"/>
    								</DataTemplate>
    							</DataGridTemplateColumn.CellEditingTemplate>
    						</DataGridTemplateColumn>

    En espérant que ça serve à d'autres personnes, j'ai vu pas mal de monde bloqué sur le
    datagrid combobox selected item doesn't work.
    A+

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

Discussions similaires

  1. [C#][2.0] DataRelations, Datagrid et Combobox
    Par EFCAugure dans le forum Accès aux données
    Réponses: 3
    Dernier message: 03/03/2014, 00h55
  2. Datagrid et combobox : clic 2 fois
    Par Syrrus dans le forum Windows Forms
    Réponses: 7
    Dernier message: 24/12/2010, 17h42
  3. datagrid et combobox
    Par mapmip dans le forum ASP.NET
    Réponses: 2
    Dernier message: 14/03/2007, 19h48
  4. Datagrid et combobox avec deux datasource différents
    Par RaelRiaK dans le forum VB.NET
    Réponses: 9
    Dernier message: 07/02/2007, 10h20

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