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 :

Méthode pour créer des colonnes personnalisées ? (DataGrid)


Sujet :

Silverlight

  1. #1
    Invité
    Invité(e)
    Par défaut Méthode pour créer des colonnes personnalisées ? (DataGrid)
    Bonjour tout le monde !

    J'aimerai pouvoir créer des colonnes personnalisées pour ma DataGrid.

    Par exemple, je veux créer une colonne de type DatePicker.

    J'ai opté pour une classe partielle divisée entre C# et XAML parce que je pensais que ce serait le plus simple pour construire les templates facilement avec XAML.

    Voilà mes codes :

    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
    public partial class DataGridDateColumn : DataGridTemplateColumn
        {
            public Binding Binding
            {
                set
                {
     
                }
            }
     
            public DataGridDateColumn()
                : base()
            {
                InitializeComponent();
     
            }
        }

    Code XML : 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
    <sdk:DataGridTemplateColumn x:Class="SilverlightGrid.DataGridDateColumn"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
                 Width="100"
                 >
     
        <!-- Template de la cellule en affichage standard -->
        <sdk:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock x:Name="affichage"/>
            </DataTemplate>
        </sdk:DataGridTemplateColumn.CellTemplate>
     
        <!-- Template de la cellule en mode édition -->
        <sdk:DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <sdk:DatePicker />
            </DataTemplate>
        </sdk:DataGridTemplateColumn.CellEditingTemplate>
     
    </sdk:DataGridTemplateColumn>

    Cependant, je souhaiterais pouvoir modifier dynamiquement le Binding de la colonne, et donc du TextBlock et du DatePicker.
    Je n'arrive pas à y accéder via le C#, mais via le XAML oui (ce qui n'est pas suffisant dans mon cas).

    Vous voyez que j'ai mis un attribut x:Name au TextBlock et pourtant rien n'y fait, IntelliSense ne le détecte pas.

    Y-a-t-il une autre méthode d'y accéder ?

    Merci.
    Dernière modification par Invité ; 27/04/2011 à 09h34.

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    C'est normal que le nom n’apparaît pas avec Intellisense
    Car le textbox est dans un template. Qui va être appliqué (ou non) dynamiquement à l'exécution. Donc il est pas "vraiment" sur la page => intellisense ne le voit pas.

    Pour y avoir accès, il faut chipoter avec FindName de la classe DataTemplate.
    Mais ça me parait bien compliqué, qu'est-ce que tu veux faire exactement? Binder sur une autre propriété dynamiquement?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tu peux passer par la méthode OnApplyTemplate pour récupérer tes éléments.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses.

    Ce que je veux faire en réalité n'est pas bien compliqué.

    Je veux créer une colonne personnalisée pour un DataGrid, en l'occurrence une colonne qui affiche une date au format texte en mode standard (CellTemplate) et un DatePicker en mode édition pour permettre une modification plus commode de la date (CellEditingTemplate).

    Je veux pouvoir binder dynamiquement les 2 composants parce que je créé toutes mes colonnes au lancement (runtime).

    C'est aussi simple que ça, dans la théorie.

    J'essaye vos propositions et je poste la solution ici pour que tout le monde en profite.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je reviens ici juste pour partager avec tout le monde la solution à ce problème.

    Ceci marche aussi bien pour WPF que pour Silverlight :

    Code XML : 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
    <sdk:DataGridTemplateColumn x:Class="SilverlightGrid.DataGridDateColumn"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
                 Width="100"
                 >
     
        <!-- Template de la cellule en affichage standard -->
        <sdk:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Loaded="TextBlock_Loaded" />
            </DataTemplate>
        </sdk:DataGridTemplateColumn.CellTemplate>
     
        <!-- Template de la cellule en mode édition -->
        <sdk:DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <sdk:DatePicker Loaded="DatePicker_Loaded" />
            </DataTemplate>
        </sdk:DataGridTemplateColumn.CellEditingTemplate>
     
    </sdk:DataGridTemplateColumn>


    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
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Controls;
     
    namespace SilverlightGrid
    {
        /// <summary>
        /// Logique d'interaction pour DataGridBrowseColumn.xaml
        /// </summary>
        public partial class DataGridDateColumn : DataGridTemplateColumn
        {
            private Binding _Binding;
            private string _strFormat = "dd/MM/yyyy";
     
            public Binding Binding
            {
                set { _Binding = value; _Binding.StringFormat = _strFormat; }
                get { return _Binding; }
            }
     
            public string StringFormat
            {
                set { _Binding.StringFormat = value; _strFormat = value; }
                get { return _strFormat; }
            }
     
            private TextBlock DispMode;
            private DatePicker EditMode;
     
            public DataGridDateColumn()
                : base()
            {
                InitializeComponent();
                DispMode = new TextBlock();
                EditMode = new DatePicker();
            }
     
            private void TextBlock_Loaded(object sender, RoutedEventArgs e)
            {
                DispMode = (TextBlock)sender;
                DispMode.SetBinding(TextBlock.TextProperty, this._Binding);
            }
     
            private void DatePicker_Loaded(object sender, RoutedEventArgs e)
            {
                EditMode = (DatePicker)sender;
                EditMode.SetBinding(DatePicker.TextProperty, this._Binding);
                EditMode.SetBinding(DatePicker.SelectedDateProperty, this._Binding);
            }
        }
    }

    J'espère que ça aidera les autres.

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

Discussions similaires

  1. Créer des prompts pour selectionner des colonnes
    Par thtghgh dans le forum SAS Base
    Réponses: 4
    Dernier message: 10/12/2013, 13h37
  2. Comment créer dynamiquement des colonnes à un datagrid par binding
    Par zoaax dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 05/01/2011, 13h54
  3. pb pour créer des index [too many keys]
    Par Issam dans le forum Débuter
    Réponses: 3
    Dernier message: 19/01/2005, 20h58
  4. [CR] Version nécessaire pour créer des fichiers DSR ?
    Par aysse dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/11/2003, 09h01
  5. quel langage pour créer des "applications" sur 1 s
    Par jaribu dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 30/07/2003, 14h06

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