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 :

"Double" databinding en WPF (datagrid/combobox)


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Points : 43
    Points
    43
    Par défaut "Double" databinding en WPF (datagrid/combobox)
    Salut tout le monde!

    je suis en train d'essayer de créer une datagrid modifiable, seulement voilà moi et le binding on est pas encore tout à fait pote.
    Mes données joignent une couleur avec un code, un libellé etc.
    Pour les champs textes les rendre modifiables en mettant une textbox se révèle pas trop mal (même si j'arrive pas à faire que quand l'utilisateur modifie le champ ça modifie la donnée en mémoire automatiquement; je fais l'update "à la main" dans le textchanged mais au moins ça marche)

    Par contre là où je coince c'est pour ma couleur. La 1ère colonne représente ce que je voudrais faire si j'arrivais à binder correctement (une combobox des couleurs qui affiche celle de ma data et modifiable au besoin), la 2ème est non modifiable juste un affichage de ma data ( appelée à sauter quand la 1ère marchera)

    Ma datagrid à jusque là cette tête
    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
    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
     <DataGrid ItemsSource="{Binding ListeCoul}" MaxWidth="1000"  AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="12,92,0,12" Name="ListeCouleur" CanUserResizeRows="False" CanUserAddRows="True" CanUserDeleteRows="True" IsTabStop="True" CanUserResizeColumns="False" CanUserReorderColumns="False">
                <DataGrid.Columns>
                    <DataGridTemplateColumn  Width="Auto" IsReadOnly="false" Header="Couleur Test">
    /*TEST de combobox de choix des couleurs déjà bindé à une ressource statique que je n'arrive à placer automatiquement sur la couleur qu'elle devrait afficher en fonction de son rang dans la datagrid (je voudrais qu'elle ait la même que la colonne dessous)*/
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox Name="cboColorsdata" Width="Auto" ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}" SelectedValuePath="Name" SelectedValue="{Binding Couleur}">
                                    <ComboBox.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal" Height="18" Margin="0,0,0,2">
                                                <Border BorderThickness="1" CornerRadius="2" 
                                                BorderBrush="Black" Width="50" VerticalAlignment="Stretch"
                                                Background="{Binding Name}"/>
                                                <TextBlock Text="{Binding Name}" Margin="8,0,0,0"/>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ComboBox.ItemTemplate>
                                </ComboBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn  Width="Auto" IsReadOnly="false" Header="Couleur">/*ce binding marche bien j'obtiens bien ma couleur illustrée dans ma case*/
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Height="22" Margin="0,0,0,2">
                                    <Border BorderThickness="1" CornerRadius="2" 
                                     BorderBrush="Black" Width="50" VerticalAlignment="Stretch"
                                     Background="{Binding Couleur}"/>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn  Width="Auto" IsReadOnly="false" Header="Code" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Height="22" Margin="0,0,0,2">
                                    <TextBox Text="{Binding Code, Mode=TwoWay,IsAsync=True}" Name="Code"   Margin="8,0,0,0" MaxLength="10" TextChanged="Code_TextChanged" />
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn  Width="Auto" IsReadOnly="false" Header="Libellé" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Height="22" Margin="0,0,0,2">
                                    <TextBox Text="{Binding Libelle, Mode=TwoWay,IsAsync=True}" Name="lib"   Margin="8,0,0,0" MaxLength="36" TextChanged="lib_TextChanged" />
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    /*plus d'autres items sur le même principe*/
                </DataGrid.Columns>
            </DataGrid>

    voilà je suppose que le binding avec la ressource statique rentre en conflit avec le binding initial de la datagrid.
    Il doit y avoir un moyen de le contourner avec des "relativesource" ou des "path" mais j'ai encore énormément de mal à savoir comment ça marche quand c'est pas "simple" comme les autres colonnes.

    Merci de votre aide!

  2. #2
    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

    Tu serais plus à l'aise pour ton binding avec un DataGridComboBoxColumn qu'un ComboBox "ordinaire" template ,car je subbodore que le combo "ordinaire" ne possede pas tous ses moyens lorsqu'il est insere dans un DataGrid via des columns "templates" .Raison qui aurait pousse MS a mettre au point le quidam DataGridComboBoxColumn ,& consorts DataGridTextBoxColumn etc...

    Le binding avec les props SelectedValuePath et ce => SelectedValueBinding et l'affichage du nom de couleur avec DisplayMemberPath permettent de lier la prop selectionne Name du DataGridComboBox avec la prop Couleur en cours dans ton DataGrid et la modifier ...!!!
    De plus au lancement le combo affiche les couleurs en cours dans le dgv...

    voici le xaml qui fera je l'espere ton bonheur:
    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
     <!--TEST de combobox de choix des couleurs déjà bindé à une ressource statique que je n'arrive à placer automatiquement sur la couleur qu'elle devrait afficher en fonction de son rang dans la datagrid (je voudrais qu'elle ait la même que la colonne dessous)-->
                <DataGrid.Columns >
                    <DataGridComboBoxColumn 
                        Width="Auto"  x:Name="cboColorsdata"  Header="Couleur Test"
                        ItemsSource="{StaticResource colorPropertiesOdp}"
                        SelectedValuePath="Name"
                        SelectedValueBinding="{Binding Couleur}"
                        DisplayMemberPath="ColorName">
                        <!--CE STYLE DE CELLULE AMELIORE L'ASPECT DU DATAGRIDCOMBOBOXCOLUMN 
                            FAUTE HELAS D'UN DATATEMPLATE -->
                        <DataGridComboBoxColumn.CellStyle >
                            <Style  TargetType="DataGridCell">
                                <Setter Property="BorderBrush" Value="Black"/>
                                <Setter Property="BorderThickness" Value="1"/>
                                <Setter Property="Margin" Value="5"/>
                                <Setter Property="Background" Value="{Binding Couleur}"/>
                            </Style>
                        </DataGridComboBoxColumn.CellStyle>
                    </DataGridComboBoxColumn>
    Le reste du XAML est à maintenir en l'etat....!!!
    Le DataGridComboBoxColumn ne possede pas helas de prop DataTemplate ,comme son cousin DataGridTextBox,DataGridHyperLinkColum ....ce qui expliques peut etre tes tentatives infructueuses...
    bon code...

  3. #3
    Membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Salut, merci du conseil!
    j'ai testé mais deux choses me chagrinent:

    • A l'ouverture j'ai bien la bonne couleur qui s'affiche mais la partie colorée a tout sauf la tronche d'une combobox et faut vraiment avoir l'idée d'aller cliquer dessus pour que le skin de la combobox apparaisse (pas très affordant)
    • Sans datatemplate la liste offre que le nom des couleurs, c'est beaucoup moins classouille que d'avoir le petit rectangle de la bonne couleur à côté


    J'ai toujours pas réussi à faire qu'à l'ouverture ma combobox originale se place sur la bonne couleur; je pense que ça peut être dû à une désynchro entre le moment où la combobox se crée et où elle se charge.
    Parce que quand j'ajoute des éléments dans ma datagrid la couleur se place bien.
    Je vais essayer de creuser dans ce sens, merci en tout cas pour ton aide.

Discussions similaires

  1. quotes, doubles quotes, échappement etc. au secours !
    Par robiwan dans le forum Langage
    Réponses: 9
    Dernier message: 30/04/2008, 15h09
  2. [MySQL] Sauvegarder du texte (db mysql) CR, single-quote, double-quote, etc
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2007, 11h22

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