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

Silverlight Discussion :

Selected item et databinding


Sujet :

Silverlight

  1. #1
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut Selected item et databinding
    Bonjour,

    J'ai deux gridview. Je remplis le premier. Je souhaite en cliquant sur une ligne de ce premier gridview, remplir le deuxième avec les données sélectionnées, mais avec une présentation différente (passer les lignes en colonnes). cf l'image ci-dessous.

    Quelqu'un peut-il éclairer mon chemin ?
    Merci d'avance et bonne journée
    Images attachées Images attachées  

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Bonjour,

    Je ne vois pas trop l'utilité de ton 2em GridView puisque c'est juste un formulaire qui ressemble à un GridView. Un UserControl bien désigné devrait faire l'affaire et c'est plus facile à mettre en place

    Si vraiment tu veux un 2em GridView, il te faudra transformer la donnée sélectionnée dans le 1er GridView en une liste de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class LineOfGrid()
    {
         public string Name
         {
         get;
         set;
         }
     
         public SystemLevel
         {
           get;
           set;
         }
    }
    Pas très propre...

  3. #3
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut
    Je ne vois pas trop l'utilité de ton 2em GridView puisque c'est juste un formulaire qui ressemble à un GridView. Un UserControl bien désigné devrait faire l'affaire et c'est plus facile à mettre en place
    Un Usercontrol bien désigné ? Probablement question de débutant (ah ben oui j'en suis un ^^) mais que veux tu dire par là ?
    As-tu un exemple dont je puisse m'inspirer pour ma question ? et surtout comment fonctionnerait le lien SelectedItem avec la première gridview ?

    merci de ta prompte réponse

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Un Usercontrol bien désigné ? Probablement question de débutant (ah ben oui j'en suis un ^^) mais que veux tu dire par là ?
    Ton 2em GridView n'en est pas un c'est juste un formulaire qui contient des informations :

    - Type :
    - Severity :
    ...

    on peut representer ce formulaire dans un UserControl (appellons le MonFormulaire) :

    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
     
      <Grid x:Name="LayoutRoot">
     
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
     
            <Grid.RowDefinitions>
     
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
     
            </Grid.RowDefinitions>
     
            <TextBlock Text="Type"></TextBlock>
            <TextBlock Text="Severity" Grid.Row="1"></TextBlock>
     
            <TextBlock Text="{Binding Type}" Grid.Column="1" Grid.Row="0"></TextBlock>
            <TextBlock Text="{Binding Severity}" Grid.Column="1" Grid.Row="1"></TextBlock>
     
    </Grid>
    et surtout comment fonctionnerait le lien SelectedItem avec la première gridview
    Toujours avec du Binding, mais cette fois on pointe sur l'item sélectionné du 1er GridView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <my:MonFormulaire DataContext="{Binding SelectedItem, ElementName=MonPremierGridView}/>

  5. #5
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut
    merci, en effet ça marche nickel, mais j'ai besoin d'un gridview.
    De fait, mon seul souci est le databinding.
    Je rempli facilement une liste de couple de données que j'appelle SelectedElementList (le debugger me montre bien que mes données sont ramenées) mais rien ne s'affiche ni au chargement de la page ni à la sélection d'une nouvelle ligne.
    Voici mon code xaml.
    Manque-t-il quelquechose ? Y'a-t-il des évènements en plus à gérer en code behind ?
    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <StormGridView:StormGridView Grid.Row="1" RowIndicatorVisibility="Collapsed" AutoGenerateColumns="False" IsReadOnly="True"
                                                 ShowGroupPanel="False" x:Name="DetailsGridView"
                                                 ItemsSource="{Binding Path=SelectedElementList}">
                        <StormGridView:StormGridView.Columns>
                            <StormGridView:StormGridViewColumn Header="Name" DataMemberBinding="{Binding Path=LineName}" HeaderTextAlignment="Center" Width="*"/>
                            <StormGridView:StormGridViewColumn Header="{Binding Path=HeaderValue}" DataMemberBinding="{Binding Path=LineValue}" HeaderTextAlignment="Center" Width="300" TextWrapping="Wrap"/>
                        </StormGridView:StormGridView.Columns>
                    </StormGridView:StormGridView>

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Tu peux nous montrer comment tu génères SelectedElementList et sa déclaration ? Pas d'erreur de Binding dans ta fenêtre Output ?

  7. #7
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut
    dans ma page viewmodel je fais la chose suivante:

    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
            /// <summary></summary>
            List<SelectedLine> selectedElementList = new List<SelectedLine>();
     
    ...
     
            public List<SelectedLine> SelectedElementList
            {
                get { return selectedElementList; }
                set
                {
                    selectedElementList = value;
                    SafeNotify("SelectedElementList");
                }
            }
    ...
            public void SelectedElement(CustomDownload cd)
            {
                // New SelectedLine class
                SelectedLine selectedLine = new SelectedLine();
                selectedLine.HeaderValue = cd.QCName;
                selectedLine.AddInformation("Type", cd.QCType);
                selectedLine.AddInformation("Severity", cd.QCSeverity);
                selectedLine.AddInformation("Description", cd.QCDescription);
                selectedLine.AddInformation("Synopsis", cd.QCSynopsis);
     
                // add selected information in list
                SelectedElementList.Add(selectedLine);
     
                SafeNotify("SelectedElementList");
            }
    ma classe SelectedLine me permet d'ajouter mon couple de valeurs :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Collections.Generic;
     
    namespace QualityControl.DataContract
    {
        public class SelectedLine
        {
            #region attributes        
            /// <summary></summary>
            string headerValue;
            /// <summary></summary>
            List<LineOfGrid> coupleList = new List<LineOfGrid>();
            #endregion
     
            #region Properties
            /// <summary></summary>
            public List<LineOfGrid> InformationList
            {
                get { return coupleList; }
                set { coupleList = value; }
            }
            /// <summary></summary>
            public string HeaderValue
            {
                get { return headerValue; }
                set { headerValue = value; }
            }
            #endregion
     
            #region constructor
            /// <summary>
            /// 
            /// </summary>
            /// <param name="headerValue"></param>
            void SelectLine(string headerValue)
            {
                this.HeaderValue = headerValue;
            }
            #endregion
     
            #region methods
            /// <summary>
            /// 
            /// </summary>
            /// <param name="name"></param>
            /// <param name="value"></param>
            public void AddInformation(string name, string value)
            {
                coupleList.Add(new LineOfGrid()
                                {
                                    LineName = name,
                                    LineValue = value
                                }
                              );
            }
            #endregion
     
        }
     
        public class LineOfGrid
        {
            #region Attributes
            /// <summary></summary>
            string lineName;
            /// <summary></summary>
            string lineValue;
            #endregion
     
            #region Properties
            /// <summary></summary>
            public string LineName
            {
                get { return lineName; }
                set { lineName = value; }
            }
            /// <summary></summary>
            public string LineValue
            {
                get { return lineValue; }
                set { lineValue = value; }
            }
            #endregion
        }
    }
    j'avoue que je m'arrache les cheveux car ma liste SelectedElementList se remplit mais rien au niveau de la page xaml.

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    A première vue, tu devrais remplacer tes List par des ObservableCollection.

  9. #9
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut
    Vous pouvez énumérer toute collection qui implémente l'interface IEnumerable.Toutefois, pour paramétrer des liaisons dynamiques afin que les insertions ou suppressions dans la collection mettent automatiquement à jour l'interface utilisateur, la collection doit implémenter l'interface INotifyCollectionChanged.Cette interface expose l'événement CollectionChanged qui doit être déclenché à chaque fois que la collection sous-jacente est modifiée.
    Il est vrai que je n'avais pas précisé ça, mais j'implémente déjà INotifyCollectionChanged dans mon ViewModel. Donc ça devrait fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
           #region IPropertyChangedEvent
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void Notify(String info)
            {
                if (PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
            #endregion
    En plus je dois avouer que je ne comprends pas trop comment s'utilise cet outil ObservableCollection (j'apprends j'apprends ^^).

  10. #10
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    En plus je dois avouer que je ne comprends pas trop comment s'utilise cet outil ObservableCollection (j'apprends j'apprends ^^).
    Tu remplace simplement List<> par ObservableCollection<>
    ObservableCollection permet la notification lors de changement interne de ces items (Add, Remove, Reset, Replace). La classe INotifyPropertyChanged te permet de notifier les changements des propriétés de ta classe (ici un remplacement complet de ta list) mais pas des items à l'intérieur de ceux-ci (un add n'effectue pas de notification).

    EDIT : ObservableCollection est reconnu par le Binding qui s'abonne automatiquement à ces changements internes. Ce n'est pas le cas de List.

    Je t'avoue que je n'ai regardé que briévement tes classes mais c'est la première chose qui m'est venue à l'idée car dans une classe de type INotifyPropertyChanged les Lists sont remplacées par des ObservableCollection en général.

  11. #11
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut
    Merci, ça m'aura éclairé au moins sur le pourquoi du comment. Par contre aucun changement avec les ObservableCollections. Je me dis que ca doit venir peut être du Binding dans la page xaml ou bien du datacontext.
    je l'ai défini comme suit dans ma classe view.xaml.cs, au niveau de l'évènement de sélection de la ligne de ma première gridview.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private void QCInfos_SelectionChanged(object sender, SelectionChangeEventArgs e)
            {
                (DataContext as QualityControlViewModel).SelectedElement(QCInfos.SelectedItem as CustomDownload);
            }
    si quelqu'un a une idée (géniale) ?

  12. #12
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 58
    Par défaut
    Hop ! après grand nettoyage, j'ai trouvé. Merci pour l'aide Sam.
    Pour ceux intéressés par la solution, c'est ici.

    ma classe de liste
    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
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
     
     
    namespace QualityControl.DataContract
    {
        public class SelectedLine
        {
            #region attributes        
            /// <summary></summary>
            string lineName;
            /// <summary></summary>
            string lineValue;
            #endregion
     
            #region Properties       
     
            /// <summary></summary>
            public string LineName
            {
                get { return lineName; }
                set { lineName = value; }
            }
            /// <summary></summary>
            public string LineValue
            {
                get { return lineValue; }
                set { lineValue = value; }
            }
            #endregion
     
            #region constructor
            /// <summary>
            /// 
            /// </summary>
            /// <param name="headerValue"></param>
            public SelectedLine(string lineName, string lineValue)
            {
                this.lineName = lineName;
                this.lineValue = lineValue;
            }
            #endregion
        }
    }
    mon code behind xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            private void QCInfos_SelectionChanged(object sender, SelectionChangeEventArgs e)
            {
                string columnName = (DataContext as QualityControlViewModel).SelectedElement(QCInfos.SelectedItem as CustomDownload);
     
                DetailsGridView.Columns[1].Header = columnName;
            }
    ma page xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    <StormGridView:StormGridView Grid.Row="1" RowIndicatorVisibility="Collapsed" AutoGenerateColumns="False" IsReadOnly="True"
                                                 ShowGroupPanel="False" x:Name="DetailsGridView"
                                                 ItemsSource="{Binding Path=SelectedElementList}">
                        <StormGridView:StormGridView.Columns>
                            <StormGridView:StormGridViewColumn Header="Name" DataMemberBinding="{Binding Path=LineName}" HeaderTextAlignment="Center" Width="100"/>
                            <StormGridView:StormGridViewColumn DataMemberBinding="{Binding Path=LineValue}" HeaderTextAlignment="Center" Width="*" TextWrapping="Wrap"/>
                        </StormGridView:StormGridView.Columns>
                    </StormGridView:StormGridView>
    et enfin dans mon view model
    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
            /// <summary></summary>
            ObservableCollection<SelectedLine> selectedElementList = new ObservableCollection<SelectedLine>();
    ...
            public ObservableCollection<SelectedLine> SelectedElementList
            {
                get { return selectedElementList; }
                set
                {
                    selectedElementList = value;
                    SafeNotify("SelectedElementList");
                }
     
    ...
            public string SelectedElement(CustomDownload cd)
            {
                // Clear list
                SelectedElementList.Clear();
     
                // add selected information in list
                SelectedElementList.Add(new SelectedLine("Type", cd.QCType));
                SelectedElementList.Add(new SelectedLine("Severity", cd.QCSeverity));
                SelectedElementList.Add(new SelectedLine("Description", cd.QCDescription));
                SelectedElementList.Add(new SelectedLine("Synopsis", cd.QCSynopsis));
     
                return cd.QCName;
            }

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

Discussions similaires

  1. [RichFaces] Selected item de ComboBox
    Par badi082 dans le forum JSF
    Réponses: 9
    Dernier message: 04/01/2011, 08h24
  2. Afficher un tool tip sur un select item
    Par DevServlet dans le forum JSF
    Réponses: 3
    Dernier message: 24/08/2009, 11h40
  3. [Qt]Selection Item Qlistwidget par Id ou Text
    Par Andyl dans le forum Débuter
    Réponses: 4
    Dernier message: 23/07/2009, 16h12
  4. Dropdownlist selection item
    Par blandine555 dans le forum ASP.NET
    Réponses: 14
    Dernier message: 07/08/2007, 10h28
  5. h:selectOneMenu selected item
    Par *alexandre* dans le forum JSF
    Réponses: 2
    Dernier message: 26/07/2006, 14h30

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