2009-07-28 8 views
1

Hé là! Voici ma question:WPF DataGrid Colonne ComboBox: Propagating Header Combobox dans la colonne

J'ai une Datagrid dans WPF et j'ai une première colonne qui est une DataGridComboBoxColumn.

Ce que je voudrais faire est d'avoir un en-tête pour cette colonne aussi avec un combobox: en modifiant l'en-tête avec propagation dans la colonne.

Je peux obtenir ceci visuellement, mais quand je soumets les données, la liste qui est liée avec le Datagrid ne porte pas les nouvelles valeurs de liste déroulante.

<dg:DataGridComboBoxColumn SelectedItemBinding="{Binding BIBStatus}"            
          ItemsSource="{Binding Source={StaticResource typeStatus}}" 
          Width="0.20*"> 
        <dg:DataGridComboBoxColumn.HeaderTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="Built-In Bridge"/> 
           <ComboBox SelectedItem="{Binding BIBStatus}" 
              SelectionChanged="ComboBox_SelectionChanged" 
              ItemsSource="{Binding Source={StaticResource typeStatus}}"/> 
          </StackPanel>         
         </DataTemplate> 
        </dg:DataGridComboBoxColumn.HeaderTemplate> 
       </dg:DataGridComboBoxColumn> 

Dans le ComboBox_SelectionChanged je le code suivant:

DataGridColumn comboCol = this.gridResults.Columns[0]; 

     for (int i = 0; i < this.gridResults.Items.Count; i++) 
     { 
      ComboBox myCmBox = (comboCol.GetCellContent(this.gridResults.Items[i]) as ComboBox); 

      myCmBox.SelectedValue = ((ComboBox)sender).SelectedValue; 
     } 

Quand je soumets les données, je soumets la liste qui est DataContext à l'Datagrid; si je change la valeur de la première colonne adressant une ligne à la fois, c.-à-d. en cliquant sur la cellule avec la liste déroulante dans chaque rangée, les valeurs sont propagées à la liste dans DataContext, cependant si je change la valeur de la première colonne par l'en-tête ce ne est pas.

Quelqu'un peut-il me dire ce qui me manque? Je suppose que c'est la façon dont j'affecte chaque ligne, mais j'ai essayé SelectedValue, SelectedItem et SelectedIndex ... tout en vain.

Merci à l'avance ...

+0

Étant donné que vous effectuez une liaison de données bidirectionnelle, la modification de la source de données doit modifier l'option sélectionnée de la liste déroulante. Que se passe-t-il lorsque vous définissez directement BIBStatus? –

+0

Je pensais à ça :) mais le problème est qu'il ne met à jour chaque combobox de chaque ligne quand je clique dessus pour l'éditer ... sinon chaque ligne reste la même. Je suppose que le problème peut être lié au déclenchement de l'événement SelectionChanged dans la zone de liste déroulante de chaque ligne, car la liaison de données fonctionne lorsque je sélectionne la valeur dans chaque ligne. Lorsque je modifie les valeurs des zones de liste déroulante dans le code, cet événement SelectionChanged n'est pas déclenché, car il ne se produit pas dans l'interface utilisateur ... toutes les suppositions? – LostKaleb

Répondre

0

Je pense que je l'ai résolu ... ou au moins déguisée ...

DataGridColumn comboCol = this.gridResults.Columns[0]; 

     for (int i = 0; i < this.gridResults.Items.Count; i++) 
     { 
      ComboBox myCmBox = (comboCol.GetCellContent(this.gridResults.Items[i]) as ComboBox); 
      myCmBox.SelectedItem = ((ComboBox)sender).SelectedItem; 
     } 

     if (this._results != null) 
     { 
      foreach (Device device in _results) 
      { 
       device.BIBStatus = (TypeStatus)Enum.ToObject(typeof(TypeStatus), ((ComboBox)sender).SelectedValue); 
      } 
     } 

J'ai essayé de changer seulement le datacontext et d'espoir pour la Liaison bidirectionnelle au travail, mais seulement lorsque je me suis concentré sur la combobox de chaque ligne. Alors j'ai pensé: "pourquoi pas des deux côtés?" Comme vous pouvez le voir, je change à la fois l'option sélectionnée de chaque combobox et l'état BIB de chaque périphérique (la partie datacontext). De cette façon, j'obtiens l'effet désiré.

Cependant, je ne pense pas que cette solution soit la meilleure et j'espère toujours qu'il y a une façon de le faire sans être une fripouille.

Toutes les suggestions sont toujours les bienvenues!

Questions connexes