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 :

Template dynamique pour entête de colonne


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 95
    Par défaut Template dynamique pour entête de colonne
    Bonjour,

    j'essaye de gérer dynamiquement une méthode de filtrage par colonne dans un DataGrid.

    Ce que j'essaye de faire, c'est d'appliquer un template à mes DataGridColumnHeader en fonction de la source de donnée de la colonne.

    Pour faire simple, si mon objet métier dispose de deux propriété, un string et un entier. Je voudrais que pour la colonne affichant la string, le DataGridColumnHeader affiche un template particulier (contenant une textbox) et que pour la colonne affichant l'int, son DataGridColumnHeader affiche un autre template (contenant une dropdown liste + une textbox. Les deux templates étant définit dans les ressources de l'application.

    J'arrive plus ou moins à mes fins en gérant l'évènement AutoGeneratedColumns :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void This_AutoGeneratedColumns(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                if (e.PropertyType.Name == "Int32")
                {
                    e.Column.HeaderTemplate = This.FindResource("intHeader") as DataTemplate;
                }
                else
                {
                    e.Column.HeaderTemplate = This.FindResource("stringHeader") as DataTemplate;
                }
            }
    Toutefois, je voudrais être capable de faire la même chose si je ne veux pas générer mes colonnes automatiquement. Je voulais passer par un DataTemplateSelector en définissant la propriété HeaderTemplateSelector de DataGridColumn, mais je me pose la question de comment récupérer le type de la propriété de ma colonne dans mon DataTemplateSelector (de la même manière que dans le code plus haut) quand l'objet que je récupère en redéfinissant SelectTemplate n'est que la chaine de caractère de l'entête de la colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class DataGridColumnHeaderTemplateSelector : DataTemplateSelector
        {
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                /*
                     item contient la chaine de caractère de l'entête de ma colonne.
                     container contient un Contentpresenter dans lequel je suis capable de récupérer le DataGridColumnHeader concerné.
                     Ce que je voudrais faire ici c'est choisir le template en fonction du type de la propriété contenu dans la colonne qui vient d'appeler cette méthode.
                 * */
            }
        }
    J'espère avoir été clair, merci pour votre attention.

    Edit :

    Du coup mon problême se résume à une question.
    Est ce que l'on peut récupérer depuis un DataGridColumnHeader ou une DataGridColumn le type de la propriété sur laquelle la colonne est bind ? (string, int32 ...)

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 95
    Par défaut
    Je ne suis pas complètement convaincu de ma solution, mais ça fonctionne :

    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
     
    public class DataGridColumnHeaderTemplateSelector : DataTemplateSelector
        {
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                ContentPresenter presenter = container as ContentPresenter;
                DataGridColumnHeader header = presenter.TemplatedParent as DataGridColumnHeader;
                Binding binding = header.Column.ClipboardContentBinding as Binding;
                String path = binding.Path.Path;
                DataGrid dataGrid = TryFindParent<DataGrid>(header);
                ItemCollection collection = dataGrid.Items;
                Object objet = null;
                if (!collection.IsEmpty)
                    objet = collection.GetItemAt(0);
                if (objet == null)
                    return null;
                String property = objet.GetType().GetProperty(path).PropertyType.Name;
     
                var windows = Application.Current.MainWindow;
                if (property == "String")
                    return windows.FindResource("stringHeader") as DataTemplate;
                if (property == "Int32")
                    return windows.FindResource("intHeader") as DataTemplate;
                return null;
            }
     
            public static T TryFindParent<T>(DependencyObject child)
              where T : DependencyObject
            {
                DependencyObject parentObject = GetParentObject(child);
     
                if (parentObject == null) return null;
     
                T parent = parentObject as T;
                if (parent != null)
                {
                    return parent;
                }
                else
                {
                    return TryFindParent<T>(parentObject);
                }
            }
     
            public static DependencyObject GetParentObject(DependencyObject child)
            {
                if (child == null) return null;
                ContentElement contentElement = child as ContentElement;
     
                if (contentElement != null)
                {
                    DependencyObject parent = ContentOperations.GetParent(contentElement);
                    if (parent != null) return parent;
     
                    FrameworkContentElement fce = contentElement as FrameworkContentElement;
                    return fce != null ? fce.Parent : null;
                }
     
                return VisualTreeHelper.GetParent(child);
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            private void This_AutoGeneratedColumns(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                e.Column.HeaderTemplateSelector = This.FindResource("headerSelector") as DataTemplateSelector;
            }

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

Discussions similaires

  1. DBGrid - changer le noms des entête de colonnes ?
    Par safab dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/11/2004, 16h49
  2. [JTextArea]changer dynamiquement le nombre de colonnes
    Par MrDuChnok dans le forum Composants
    Réponses: 9
    Dernier message: 27/04/2004, 13h31
  3. libelles et entêtes de colonnes dynamiques
    Par valfredr dans le forum XMLRAD
    Réponses: 7
    Dernier message: 09/03/2004, 21h40

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