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 :

WPF binding collection dans header et colonne dans un datagrid [MVVM]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 34
    Points : 22
    Points
    22
    Par défaut WPF binding collection dans header et colonne dans un datagrid
    Bonjour,
    je voudrais afficher dans l’entête et dans la cellule les valeurs d'une collection.
    Dans ma collection j'ai des valeurs, les champs 'Name' et 'Value', je veux afficher 'Name' dans l'entete et 'Value' dans la colonne.
    Je suis dans une application wpf mvvm.
    Dans 'Users' j'ai bien une collection de 'User' avec ses données, mais à l'affichage je n'obtient aucune valeur, ni dans l'entête ni dans les colonnes.
    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
     
     
    private ObservableCollection<User> co_Users;
     
    		/// <summary>
    		/// Propriété UserFields
    		/// </summary>
    		public ObservableCollection<User> Users
    		{
    			get { return co_Users; }
    			set
    			{
    				if (co_Users != value)
    				{
    					co_Users = value;
    					RaisePropertyChanged(() => Users);
    				}
    			}
    		}
    le code Xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Users}">
     
     
    						<DataGridTextColumn Binding="{Binding Users[1].Value}" Header="{Binding Users[1].Name}" />
    						<DataGridTextColumn Binding="{Binding Users[2].Value}" Header="{Binding Users[2].Name}" />
    						<DataGridTextColumn Binding="{Binding Users[3].Value}" Header="{Binding Users[3].Name}" />
    						<DataGridTextColumn Binding="{Binding Users[4].Value}" Header="{Binding Users[4].Name}" />
    						<DataGridTextColumn Binding="{Binding Users[5].Value}" Header="{Binding Users[5].Name}" />
    					</DataGrid.Columns>
    				</DataGrid>


    [France] Profil pro
    Inscrit en
    septembre 2009
    Messages
    29
    [Plus de détails...]
    Points
    18

    Par défaut

    j'ai essayé une autre méthode:
    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
     
     
    // la classe
    public class ColumnDescriptor
    	{
    		public string HeaderText { get; set; }
    		public string DisplayMember { get; set; }
    	}
     
     
    // mon viewmodel
    public ObservableCollection<ColumnDescriptor> Columns { get; private set; }
    this.Columns = new ObservableCollection<ColumnDescriptor>();
    foreach (User item in Users)
    			{
    				Columns.Add(new ColumnDescriptor { HeaderText = item.Name, DisplayMember = "InputValue"});
    			}
    le code xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    <ListView ItemsSource="{Binding Users}">
    	<ListView.View>
    		<GridView  local:GridViewColumns.DisplayMemberMember="DisplayMember"
    						                local:GridViewColumns.HeaderTextMember="HeaderText" local:GridViewColumns.ColumnsSource="{Binding Columns}">
    		</GridView>
    	</ListView.View>
    </ListView>
    Mais je n'obtient pas le résultat escompté , j'ai bien les entêtes, mais dans les cellules j'ai les collections de chaque User et non la valeur 'Value' attaché.

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    C'est vraiment pas clair ton probleme.
    De quel type est l'objet User.Value?

    S'il s'agit lui même d'une collection il faut un template qui embarque un itemcontrol pour l'afficher.

    Essaye de mieux structurer le probleme, parceque là c'est trop fouillis.

  3. #3
    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
    Comme dit par micka132,le code donné par tes soins est mal structure pour ne pas dire plus ,incomplet pour t'aider comme toujours !!!

    ce code xaml n'est pas valide à cause de nombreuse erreurs de syntaxe:
    - la syntaxe d'index ne sert rien si on veut afficher un ObservableCollection<User> ,une ligne par prop suffit....
    - il suffit de prefixer la prop par le nom de class (User) ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Users}">
         </DataGrid.Columns>
                     <DataGridTextColumn Binding="{Binding User.Value}" Header="{Binding User.Name}" />
           <DataGridTextColumn 				
         </DataGrid.Columns>
    </DataGrid>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Bonjour,
    Tput d'abord merci de votre aide .


    je vais essayer d'être plus précis dans mes explications, c'est vrai que pour moi c'était limpide mais vu de l'extérieur ça l'est un peu moins.

    Je dois afficher dans un DataGrid , à partir d'une collection de classe de 'User', le champ 'Name' et le champ 'Value' de la même classe.

    Pour chaque classe 'User', j'affiche en entête le champ 'Name' et dans la cellule le champ 'Value'.

    Par exemple, si j'ai une collection de 8 'User', j'ai un DataGrid avec 8 colonnes et une seul ligne de valeurs.


    voici la classe User (pour Micka132) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public class User
    {
    public int IdUser { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    ...
    }
    et ma collection de User :

    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
     
    private ObservableCollection<User> co_Users;
     
    		/// <summary>
    		/// Propriété UserFields
    		/// </summary>
    		public ObservableCollection<User> Users
    		{
    			get { return co_Users; }
    			set
    			{
    				if (co_Users != value)
    				{
    					co_Users = value;
    					RaisePropertyChanged(() => Users);
    				}
    			}
    		}
    Désolé pour la structure du code xaml, j'ai recopié mon code à la hâte.

    En essayant le code de Mabrouki :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Users}">
    					<DataGrid.Columns>
    						<DataGridTextColumn Binding="{Binding User.Value}" Header="{Binding User.Name}" />
     
    					</DataGrid.Columns>
    				</DataGrid>
    j'obtient un DataGrid vide.

    Ma collection 'Users' est bien alimenté par le View Model, mais ne s'affiche pas.

    Après de longues recherches,non fructueuses je l'admet, j'ai trouvé que cela provient surement du fait que le DataGridTextColumn n'hérite pas du DataContext du DataGrid, ce n'est pas un Framework Element ( cf google ).

    J'espère vous avoir un peu plus éclairé
    Et merci encore de votre aide et de votre patience !!!

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Je ne vois pas comment faire avec une datagrid sans passer par du code behind.
    Mais vu que je pense pas qu'il y ai un impératif à utiliser une datagrid je pense qu'il vaut mieux passer par un simple itemcontrol, ou ses derivées en redefinissant le panel comme un stackpanel horizontal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     <ItemsControl ItemsSource="{Binding Users}" >
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}"/>
                            <TextBlock Text="{Binding Value}"/>
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
    Il y a plus qu'à jouer avec les margins/paddings.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    J'ai essayé une autre méthode( une de plus), en suivant ce lien :

    http://www.benbarefield.com/blog/201...agrid-columns/

    dans mon view model j'ai les collections :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // mon viewmodel
    public ObservableCollection<ColumnDescriptor> Columns { get; private set; }
    this.Columns = new ObservableCollection<ColumnDescriptor>();
    foreach (User item in Users)
    			{
    				Columns.Add(new ColumnDescriptor { HeaderText = item.Name, DisplayMember = "Value"});
    			}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <DataGrid t:DataGridColumns.DisplayColumns="{Binding Columns}"
    			          AutoGenerateColumns="False"
    			          ItemsSource="{Binding Users}">
    				<t:DataGridColumns.ColumnSettingsTemplate>
    					<DataTemplate>
    						<t:DataGridColumnSettings ColumnBindingPath="{Binding DisplayMember}" Header="{Binding HeaderText}">
    						</t:DataGridColumnSettings>
    					</DataTemplate>
    				</t:DataGridColumns.ColumnSettingsTemplate>
    			</DataGrid>
    cette fois ci j'ai bien mes valeurs dans les entêtes mais dans les cellules j'ai toutes les valeurs de la classe User et on pas uniquement la valeur 'Value' .

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Merci Micka132
    je vais voir avec ta méthode, le but suivant était d'avoir un DataGrid avec plusieurs 'Users' et pouvoir trier par colonne, d'où le DataGrid et le pattern MVVM .

    merci encore de ton aide .

    je vais continuer à chercher de mon côté .

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Citation Envoyé par gurcan Voir le message
    je vais voir avec ta méthode, le but suivant était d'avoir un DataGrid avec plusieurs 'Users' et pouvoir trier par colonne, d'où le DataGrid et le pattern MVVM .
    Hum, vu que tu n'as qu'une seule ligne en dehors du header, tu veux trier quoi?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    En faites je vais avoir une collection de collection de 'User', une ligne correspond à une collection de 'User', je vais devoir trier sur les lignes des collections de 'User' .

    Ceci sera la prochaine étape de mon projet .

    j'espère ne pas m'être enfoncé encore plus dans mes explications

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

Discussions similaires

  1. WPF binding collection dans header et colonne dans un datagrid
    Par gurcan dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 23/08/2016, 10h53
  2. Réponses: 2
    Dernier message: 03/07/2014, 14h06
  3. [MVVM] Binding d'un nom de colonne dans un datagrid
    Par Oberown dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 21/08/2012, 14h04
  4. verifier les valeurs d'une colonne dans une autre colonne
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/04/2008, 20h24
  5. Colonnes dans le WHERE donc dans le SELECT ?
    Par nicoreims dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 10h54

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