2009-04-10 8 views
2

J'utilise le composant DataGrid WPF avec un DataGridTemplateColumn. Le DataGridTemplateColumn.CellEditingTemplate contient un ComboBox avec IsEditable défini sur 'true'. Dans mon gestionnaire d'événements RowEditEnding, je voudrais lire la propriété Text de ce ComboBox - le seul problème est que je ne sais pas comment récupérer l'instance ComboBox dans le gestionnaire d'événements afin d'accéder à la propriété Text.DataGrid: aide pour accéder à un contrôle défini dans un CellEditingTemplate

Pour référence, voici mon DataTemplate:

<!-- ... --> 
    <my:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox IsEditable="True" ItemsSource="{Binding Source={StaticResource ProductCategories}}" SelectedItem="{Binding Path=Name}" DisplayMemberPath="Name" /> 
     </DataTemplate> 
    </my:DataGridTemplateColumn.CellEditingTemplate> 
    <!-- ... --> 

Et mon code:

private void productsDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     // UH-OH! Where do I find the ComboBox instance? 
    } 

Je sais que je peux arriver à la ligne affectée actuelle à l'aide e.Row ... Peut-être la solution implique quelque chose en utilisant e.Row? J'ai essayé de parcourir l'arborescence visuelle de manière récursive à partir d'e. Descendre en cherchant une instance de ComboBox, mais pas de dés. Je suis presque certain que la solution est simple, cependant, je suis relativement nouveau à WPF en général. Toutes les suggestions seraient grandement appréciées.

Merci!

+0

Avez-vous trouvé une solution? – Shimmy

Répondre

1

vous pouvez obtenir de la colonne Combobox directement à partir de votre DataGrid en utilisant ce code

var cbx = (DataGridComboBoxColumn)productsDataGrid.Columns.First(a => a.Header.ToString() == "name of your column"); 
+0

Alors, comment obtenez-vous le CellEditingTemplate? l'OP parlait d'un DataGridTemplateColumn, pas d'un DataGridComboBoxColumn. – Shimmy

1

Il semble accès au CellEditingTemplate est disponible uniquement pendant l'événement PreparingCellForEdit dans le DataGrid. Vous pouvez câbler un virage pour cet événement sur le DataGrid et faire quelque chose comme ça sur le gestionnaire pour accéder à votre ComboBox

private void _CounterGoalsGrid_PreparingCellForEdit(object sender, 
    DataGridPreparingCellForEditEventArgs e) 
    { 
     ComboBox editCombo = (e.EditingElement.FindName("<your combobox name>") as ComboBox); 
    } 
  • Rappelez-vous le nom de votre ComboBox en XAML.
Questions connexes